Нечетный вывод при передаче файлового потока по ссылке

В приведенном ниже коде мне нужно прочитать следующее из файла данных:

Dean DeFino     88  98  99
Sally Johnson   78  89  82
Bill Benny      75  79  81
Thomas Billows  78  84  89

Тем не менее, я получаю этот вывод:

Dean DeFino           88        98        99
hnson   78  89        82-1850860984     32742
0         0        28
0-413051128        48
-1608528832     32767-415228472
0    -49089-1024065536   6406657
-512190696        48     18048
32767         0         0
0-1850766544     32742-520043854
0        48-517861416        48
-1608527569     32767-520043904
0     32767-520041858        48
-1564475392    -49089         0
48-1850766544     32742
-514484708        48     26100
0-1608527632     32767
`-1608528304     32767-310120049
0        48         0         0
-1608527592     32767-1608527584
48-520056170        48
`-1850862392     32742-1608528432
32742 479434334         0
7491161         0        30
a         0-1608528048     32767
H<@0-1024065536   6406657-1398731262
f 673193995 5371330921477443664
DB(         0         0-1850860160
48-515832000        48
0      2027         1-520053849
0     32742-1608527968     32767
-1850860160     32742 479434334
0-1850860160     32742
6         0-1850860928
48         6         0
[-310357908        48         0
48-520056170        48
-310356040        48-1608527984
32742 725871085         0
11341735         0        45
0         0-1608527600     32767
H<@0-310281904        48-1850766920
32767-1850767776     32742
0         0-1850860808
0-515832000        48
@@           786         1         0
48-1608527520     32767
-1850860808     32742 725871085
0-1850860808     32742
1     32767-517860984
0         1-310305400        48

Похоже, что только первая и половина строки читаются правильно. Учитывая код ниже, я не вижу, где проблема. Какие-нибудь мысли?

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

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

};

typedef Grades gradeType[MAXRECORDS];

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

int main()

{
ifstream indata;
indata.open("graderoll.dat");
gradeType studentRecord;

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

readIt(indata, studentRecord, MAXRECORDS);for (int count = 0; count < MAXRECORDS; count++)
{
cout << studentRecord[count].name << setw(10)
<< studentRecord[count].test1
<< setw(10) << studentRecord[count].test2;
cout << setw(10) << studentRecord[count].final << endl;
}

indata.close();

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++;     // add one to total

if (!inData.eof())
inData.get(gradeRec[total].name, NAMESIZE);
}

}

Спасибо!

0

Решение

Проблема возникает потому, что while Цикл ищет целые числа и встречает второе имя, которое не является целым числом.

Лучший способ — прочитать всю строку как строку, а затем использовать std::istringstream чтобы получить имя и тестовые значения из строки.

0

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

Когда while цикл читается, нет кода, который потребляет конец строки, поэтому одна программа встречает конец строки, пропускает остальную часть файла и цикл завершается. Странный вывод на экран является результатом вывода пустого массива из 49 значений мусора (так как MAXRECORDS = 50). Сделайте переменную с именем numRead или что-то подобное и установите его равным количеству строк, которые вы хотели бы прочитать. Поместите это как конечное условие в for петля. Тогда в while петля, место inData.ignore (NUMSIZE, ‘\ n’); до того, где вы читаете имя. Так:

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

total++;     // add one to total

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

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

0

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