c++ - 如何在 OOP 中正确使用 ifstream?
问题描述
我正在尝试创建一个文本阅读器类,在其中读取向量中所需的数据,然后在另一个类中获取该数据以获取其中的向量。
我在临时文件中尝试了相同的方法,效果很好,我可以读取文件,并且我的对象从文本文件的每一行中获取了每个元素。
但是当我尝试在 OOP 中执行此操作时,我无法读取文件,我将cout
语句放入do..while
循环中,然后它只执行一次,当然只是因为do
.
此代码在单个 cpp 文件中运行良好:
void TxtReader::read(std::vector<Contacts> &contacts){
std::string firstName;
std::string lastName;
std::string phoneNumber;
std::string birthPlace;
std::string birthDate;
std::string Profession;
std::ifstream savedContacts("ContactList.txt");
Contacts newContact = Contacts();
do {
std::getline(savedContacts, firstName, ';');
std::getline(savedContacts, lastName, ';');
std::getline(savedContacts, phoneNumber, ';');
std::getline(savedContacts, birthPlace, ';');
std::getline(savedContacts, birthDate, ';');
std::getline(savedContacts, Profession, ';');
newContact.setFirstname(firstName);
newContact.setLastname(lastName);
newContact.setPhonenumber(phoneNumber);
newContact.setBirthplace(birthPlace);
newContact.setBirthdate(birthDate);
newContact.setProfession(Profession);
contacts.push_back(newContact);
} while (std::getline(savedContacts, firstName));
}
这就是我想使用它的方式:
void ContactDir::getList() {
// contacts vector is a private member in the header file
textReader.read(contacts);
}
一旦我在 中调用它main.cpp
,其中的while
循环就会失败,可能它无法读取文件,因为它只执行一次并且我的文件有多行:
//any other function in the contactdir class works
ContactDir contacts = ContactDir();
contacts.getlist();
里面的文本文件:
Walter;Greyson;03069990643;London;1991.11.16;Engineer;
Carl;Johnson;03069990120;Manchester;1996.10.10;Teacher;
Aaron;Ramsey;03069995103;Birmingham;1969.03.05;Unemployed;
解决方案
根据您更新的问题,我修改了答案。我发现,当尝试从控制台读取文件或一系列输入时,如果我将每一行作为字符串读取,然后使用 istringstream 结合附加的 getline 解析行中的单词或标记,我会犯更少的错误。
您的文件非常适合这一点。
对于 main.cpp,我选择只使用一个 while 循环,并以读取名字为基础。其他 getline() 位于该循环内,并使用 istringstream 解析每个 ';'。这是我的 main.cpp 文件。如果您有任何问题,请告诉我。
#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
struct Contact {
std::string firstName;
std::string lastName;
};
void read(std::vector<Contact> &contacts)
{
std::string firstName;
std::string lastName;
std::ifstream savedContacts("ContactList.txt");
Contact newContact = Contact();
std::string input_line;
while (std::getline(savedContacts, input_line)) {
std::istringstream ss(input_line);
std::getline(ss, firstName, ';');
std::getline(ss, lastName, ';');
newContact.firstName = firstName;
newContact.lastName = lastName;
contacts.push_back(newContact);
}
}
int main()
{
std::vector<Contact> contacts;
read(contacts);
for(auto const contact: contacts) {
std::cout << contact.firstName << " " << contact.lastName << "\n";
}
std::cout << "Hello, World!" << std::endl;
return 0;
}
推荐阅读
- html - Angular 5 - 带火力的异步管道
- java - Java - 获取侦听端口的服务器的 IP 地址
- java - 布尔字段的 SimpleJdbcInsert 问题
- java - 即使在上面的类中也找不到变量
- javascript - 来自网站的自动电子邮件
- laravel - Vue.js - Buefy 模块(无线电 btns/复选框)
- vbscript - SAP GUI VBScript 通过数据更改剪切和粘贴块
- javascript - 从外部网站截取屏幕截图
- android - 具有自定义适配器的 ListView 在第一次加载程序重新启动时滚动到底部
- jquery - Jquery Post 响应不会使用 .done 方法(linkedin oauth)