C ++ Прочитать файл с разделителями и создать объект

0

Я пытаюсь прочитать файл, используя строки данных, чтобы создать объект.

Текущий файл у меня такой, и код, читающий файл, будет найден ниже.

*   1223 Fake1 Name1  60  70  80  24 89  add1  Male
    1224 Fake2 Name2  61  70  81  80 24  add2  Male
    1225 Fake3 Name3  63  70  82  80 89  add3  Male
    1226 Fake4 Name4  63  70  83  80 88  add4  Male*

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

Я хотел бы изменить свой файл на это;

   *1223 : Fa1 Name1 : 60 : 70 : 80 : 24 :89 : This will be address1 : Male 
    1224 : Fake2 Name2 : 61 : 70 : 81 : 80 :24 : This will be address2 : Male
    1225 : Fake3 Name3 : 63 : 70 : 82 : 80 :89 : This will be address3 : Male
    1226 : Fake4 Name4 : 63 : 70 : 83 : 80 :88 : This will be address4 : Male*

Как я могу обновить код ниже, чтобы он мог использовать разделители для создания объекта?

void loadFile(Person people[], int* i)
{
    ifstream infile("people2.txt");

    if ( !infile.is_open()) {
      // The file could not be opened
        cout << "Error";
    }
    else
    {
        string str, str1, str2, str3, str4;
        int x[6];
        while(!infile.eof())
        {
            infile >> str1; 

            infile >> str2; 

            inile >> str; 
            x[0] = stoi(str);

            infile >> str; 
            x[1] = stoi(str);

            infile >> str; 
            x[2] = stoi(str);

            infile >> str; 
            x[3] = stoi(str);

            infile >> str; 
            x[4] = stoi(str);

            infile >> str; 
            x[5] = stoi(str);
            infile >> str3; 
            infile >> str4;             
            people[*i] = Person( x[0], str2 + " " + str1, x[1], x[2], x[3], x[4], x[5], str3, str4);
            (*i)++;
        }
        infile.close();
    }

}
  • 1
    Читайте по одной строке за раз в цикле, разбивайте строку на разделителе и вставляйте правильные значения в правильные поля. Вы можете использовать одну и ту же функцию для обеих целей.
  • 0
    inile >> str; это никогда не скомпилируется
Показать ещё 1 комментарий
Теги:

1 ответ

0
Лучший ответ

Вы можете использовать std :: getline для чтения файла по строкам, а также для разделения строки на основе указанного разделителя. Например:

#include <string>
#include <fstream>
#include <sstream>
#include <vector>


int main() {
  std::ifstream infile("people2.txt");
  if (!infile) {
    std::cerr << "Could not open file." << std::endl;
    return 1;
  }

  std::string line;
  while (std::getline(infile, line)) {  // Read file line by line.
    std::string field;
    std::vector<std::string> separated_fields;
    std::istringstream iss_line(line);
    while (std::getline(iss_line, field, ':')) { // Split line on the ':' character
      separated_fields.push_back(field);    // Vector containing each field, i.e. name, address...
    }
    // Do something with the results
    separated_fields[0]; // ID
    separated_fields[1]; // Names
    separated_fields[2]; // Number
    separated_fields[3]; // Number
    separated_fields[4]; // Number
    separated_fields[5]; // Number
    separated_fields[6]; // Number
    separated_fields[7]; // Address
    separated_fields[6]; // Sex 
  }
}

Затем вы можете создать свой объект в разделе, помеченном //Do something with the results либо передав отдельные строки, как у вас в вашем примере, либо передайте вектор конструктору и применив каждое его поле.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню