首页 > 解决方案 > 如何在 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;

标签: c++oop

解决方案


根据您更新的问题,我修改了答案。我发现,当尝试从控制台读取文件或一系列输入时,如果我将每一行作为字符串读取,然后使用 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;
}

推荐阅读