我正在尝试创建一个文本阅读器类,在该类中读取向量中需要的数据,然后在另一个类中获取该数据以用于向量中。
我在一个暂存文件中尝试了相同的方法,效果很好,我可以读取该文件,并且我的对象从文本文件的每一行中获取了每个元素。
但是当我尝试在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;
答案 0 :(得分:0)
根据您更新的问题,我修改了答案。我发现,当尝试从控制台读取文件或一系列输入时,如果我将每一行读取为一个字符串,然后使用istringstream和附加的getline组合来分析行中的单词或标记,则会犯更少的错误。 / p>
您的文件非常适合此操作。
对于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;
}