Дополнительные строки нулей в выводе после чтения из файла

Я начинающий программист, пытающийся изучать C ++. Я пытаюсь прочитать следующую информацию из файла:

Декан ДеФино 88 98 99
Салли Джонсон 78 89 82
Билл Бенни 75 79 81
Томас Биллоу 78 84 89

Тем не менее, я получаю следующий вывод, и я не могу понять, почему:

Декан ДеФино 88 98 99
0 0 0
Салли Джонсон 78 89 82
0 0 0

Вот код:

#include <fstream>
#include <iostream>
#include <iomanip>
using namespace std;

const int NAMESIZE = 15;
const int MAXRECORDS = 50;
struct Grades                             // declares a structure
{
char name[NAMESIZE + 1];
int test1;
int test2;
int final;

};

typedef Grades gradeType[MAXRECORDS];
// This makes gradeType a data type
// that holds MAXRECORDS
// Grades structures.

void readIt(ifstream&, gradeType, const int);

int main()

{
ifstream indata;
indata.open("graderoll.dat");
int numRecord = 4;
gradeType studentRecord;

if(!indata)
{
cout << "Error opening file. \n";
cout << "It may not exist where indicated" << endl;
return 1;
}

readIt(indata, studentRecord, MAXRECORDS);

// output the information
for (int count = 0; count < numRecord; count++)
{
cout << studentRecord[count].name << setw(10)
<< studentRecord[count].test1
<< setw(10) << studentRecord[count].test2;
cout << setw(10) << studentRecord[count].final << endl;
}

return 0;
}

void readIt(ifstream& inData, gradeType gradeRec, const int max)

{
int total = 0;

inData.get(gradeRec[total].name, NAMESIZE);
while (inData)
{
inData >> gradeRec[total].test1;
inData >> gradeRec[total].test2;
inData >> gradeRec[total].final;

total++;

inData.clear();
inData.get(gradeRec[total].name, NAMESIZE);}

}

Любые предложения, чтобы помочь мне с этим?

0

Решение

Я решил проблему:

void readIt(ifstream& inData, gradeType gradeRec, const int max)

{
int total = 0;

inData.get(gradeRec[total].name, NAMESIZE);
while (inData)
{
inData >> gradeRec[total].test1;
inData >> gradeRec[total].test2;
inData >> gradeRec[total].final;

total++;

inData.ignore(NAMESIZE, '\n');
inData.get(gradeRec[total].name, NAMESIZE);}

}

inData.ignore (NAMESIZE, ‘\ n’); заставит массив символов работать должным образом. Это потому, что массив символов ограничен 15 символами. Таким образом, если указать игнорирование следующих 15 символов и / или до тех пор, пока не встретится escape-последовательность новой строки, каждая строка файла будет прочитана правильно.

1

Другие решения

Проблема в том, что вы используете:

while (inData)

При преобразовании iostream в логическое значение, логическое значение отражает состояние флага EOF. Однако флаг EOF не устанавливается до после Вы пытаетесь прочитать данные из конца файла.

Итак, что происходит, если ваш код успешно читает последнюю строку вашего файла, затем зацикливается, и флаг EOF еще не установлен, и пытается прочитать его Больше строка из файла. Это не читает никаких фактических данных, и вы получаете нули. После этого устанавливается флаг EOF, и ваш цикл завершается.

Одним из способов исправить это может быть проверка флага EOF после чтение ожидаемых данных, так что:

   while (true)
{
inData >> gradeRec[total].test1;
inData >> gradeRec[total].test2;
inData >> gradeRec[total].final;

if (!inData) {
break;
}

total++;

inData.clear();
inData.get(gradeRec[total].name, NAMESIZE);
}

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

0

По вопросам рекламы [email protected]