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

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

Это моя структура и данные, которые я вложил в нее:

struct employe {
    int num_employe;
    string nom;
    string prenom;
    string date_naissance;
    string ville_resi;
    int code_postal;
};


employe saisir_1_employe(vector<string> row) {
    employe e;
    e.num_employe = stoi(row[0]);
    e.nom = row[1];
    e.prenom = row[2];
    e.date_naissance = row[3];
    e.ville_resi = row[4];
    e.code_postal = stoi(row[5]);
    return (e);
}

Я извлекаю данные из файла следующим образом:

if (myfile.is_open()) {
        while (myfile >> temp) {

            row.clear();

            // read an entire row and
            // store it in a string variable 'line'
            getline(myfile, line, '\n');

            istringstream s(line);

            // read every column data of a row and
            // store it in a string variable, 'word'
            while (getline(s, word, '\t')) {

                // add all the column data
                // of a row to a vector
                row.push_back(word);
            }
            e = saisir_1_employe(row);
            afficher_1_employe(e);
        }

    }

Мой файл, из которого извлекаются данные, выглядит следующим образом: https://pastebin.com/Nfhu2tEp

Когда я отображаю второй столбец (cout << row[1]), я получаю имена отлично. Но когда я делаю cout << row[0], я получаю пустой столбец, когда предполагается, что это строка, которую я затем преобразовываю в int с e.num_employe = stoi(row[0]). Это там и имеет правильное количество строк, но просто пусто.

c++
1
Keith_Maxwell 11 Апр 2019 в 13:13

2 ответа

Лучший ответ

Я думаю, что вы должны сделать вот так

while(std::getline(myfile, line, '\n'))

Вместо того

while (myfile >> temp)

Который обрезает первое слово в каждой строке ...

2
p-a-o-l-o 11 Апр 2019 в 10:32

Используйте getline () отдельно, чтобы получить каждую строку Нет необходимости использовать эту строку:

while(myfile >> temp)

Это захват первого слова и больше никогда не вызывается.

Вместо этого выполните цикл в каждой строке, вызвав getline () для файлового потока напрямую:

while (getline(myfile, line, '\n'))

Мне нравится ваше использование stringstream для разбора слов. Вероятно, я бы использовал поток строк в функции saisir для выполнения вызовов синтаксического анализа (например, вместо stoi ()).

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

using namespace std;



struct employe {
    int num_employe;
    string nom;
    string prenom;
    string date_naissance;
    string ville_resi;
    int code_postal;
};

employe saisir_1_employe(vector<string> row )
{
  employe e;
  e.num_employe = stoi(row[0]);
  e.nom = row[1];
  e.prenom = row[2];
  e.date_naissance = row[3];
  e.ville_resi = row[4];
  e.code_postal = stoi(row[5]);
  return (e);
}

int main()
{
  fstream myfile{"myfile.txt"};
  std::string line;
  std::string word;
  std::vector<employe> employees;

  if (myfile.is_open()) {
    //    while (myfile >> temp) {
    //
    //      row.clear();

    // read an entire row and
    // store it in a string variable 'line'
    while (getline(myfile, line, '\n')) {
      std::vector<std::string> row;

      std::istringstream sline(line);

      // read every column data of a row and
      // store it in a string variable, 'word'

      while (getline(sline, word, '\t')) {

        // add all the column data
        // of a row to a vector
        row.push_back(word);
      }
      employe e;

      e = saisir_1_employe(row);
      employees.push_back(e);


//      afficher_1_employe(e);
    }

    int index = 1;

    // dump number and nom
    for(const auto& emp : employees) {
      std::cout << index++ << ". " << emp.num_employe
                << " " << emp.nom << std::endl;
    }

  }
}
1
Gardener 11 Апр 2019 в 11:06