Как правильно использовать ifstream в ООП? - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь создать класс для чтения текста, где я читаю данные, которые мне нужны, в векторе, а затем получаю эти данные в другом классе для вектора там.

Я пробовал тот же метод в чистом файле, он работал нормально, я мог прочитать файл, и мои объекты получили каждый элемент из каждой строки из текстового файла.

Но так как я пытался сделать это в ООП, я просто не могу прочитать файл, я поместил операторы 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 голосов
/ 23 апреля 2019

Исходя из вашего обновленного вопроса, я изменил ответ. Я обнаружил, что при попытке прочитать файл или серию входных данных из консоли я делаю меньше ошибок, если читаю каждую строку как строку, а затем анализирую слова или токены в строках, используя поток istringstream в сочетании с дополнительной строкой get.

Ваш файл очень хорошо к этому подходит.

Для 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...