如何在OOP中正确使用ifstream?

时间:2019-04-22 23:49:10

标签: c++ oop

我正在尝试创建一个文本阅读器类,在该类中读取向量中需要的数据,然后在另一个类中获取该数据以用于向量中。

我在一个暂存文件中尝试了相同的方法,效果很好,我可以读取该文件,并且我的对象从文本文件的每一行中获取了每个元素。

但是当我尝试在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;

1 个答案:

答案 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;
}