Не могу прочитать данные всех строк - PullRequest
0 голосов
/ 18 октября 2018

Мой код не может прочитать данные всех строк.

void read(string name, student *sv, int n) {
ifstream file (name, ios::in);
string name, sex;
int dy, mth, year, i = 0;
float a, b;
while (file >> name >> dy >> mth >> year >> sex >> a >> b) {
    cout << name << dy << mth << year << sex <<  a <<  b << endl;
    sv[i].name = name;
    sv[i].date.day = dy;
    sv[i].date.month = mth;
    sv[i].date.year = name;
    sv[i].sex = sex;
    sv[i].math = a;
    sv[i].physics = b;
    ++i;
}
file.close();

Мои данные:

Johns 3 6 1999 Male 5 7
Jeam  3 7 1998 Male 8 7
Jes   7 9 1999 Male 5 9

Когда я отлаживаю этот код, он не может прочитать последнюю строку (Jes 7 9 1999 Male 5 9).Так что struct sv не имеет последнего значения.

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Попробуйте:

// main.cpp
#include <fstream>
#include <ios>
#include <iostream>
#include <string>

struct student {
  std::string name;
  std::string sex;
};

void read(std::string fname, student *sv) {
  std::ifstream file(fname.c_str(), std::ios_base::in);
  std::string name, sex;
  int i = 0;
  while (file >> name >> sex) {
    std::cout << name << " " << sex << std::endl;
    sv[i].name = name;
    sv[i].sex = sex;
    ++i;
  }
  file.close();
  std::cout << i << std::endl;
}

int main(int argc, char **argv) {
  student sv[10];
  std::string fname(argv[1]);
  read(fname, sv);
}

Сборка:

g++ -o test main.cpp

Тестовый входной файл:

ABC Male
DEF Female
GHI Unknown
KLM Whoknows

Выполнение:

./test test.txt

Выход:

ABC Male
DEF Female
GHI Unknown
KLM Whoknows
4
0 голосов
/ 18 октября 2018

Основная проблема заключается в следующей строке:

while (file >> name >> dy >> mth >> year >> sex >> a >> b) {

Когда вы достигаете последней строки файла, вы читаете все эти переменные, но также вы достигаете конца файла, так что все выражение преобразуется в false иВы не будете выполнять код во время последней строки

Попробуйте что-то вроде этого:

std::string line;
std::getline(file, line);
while (file && !line.empty())
{
    std::cout << line << std::endl;

    //parse line and do stuff

    std::getline(file, line);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...