file io — C ++ EOF Никогда не устанавливается во время цикла Loop

Так что, в основном, я пишу программу для сбора набора данных и ввода результатов в вектор структур. Однако проблема, с которой я сталкиваюсь, заключается в том, что флаг конца файла никогда не устанавливается в цикле while, расположенном в главной функции.

int main()
{
ifstream machineRecords;
machineRecords.open ("records.txt");
if (machineRecords.fail())
{
cout << "Failed to open \'records.txt\' please make sure it is in the same directory as the executable.";
exit(1);
}

char tempChar;
string record;
do
{
int LINE = 0;
for (int x = 0; x <= 11; x++)
{
cout << "Begin storing characters in record" << endl;
do  //Stores one character at a time into the node string until it discovers the end of the node
{
tempChar = machineRecords.get();
record += tempChar;
cout << "||" << tempChar << endl;
//_getch();
} while (tempChar != '|' && tempChar != '\n');
eraseCharFromString(record, '|');       //Removes ending tag character
eraseCharFromString(record, '\n');  //Removes any sneaky newline characters

cout << "Record: " << record << endl;

switch(x)
{
case 0:
machines[LINE].idNumber = atoi(record.c_str());
break;
case 1:
machines[LINE].description = record;
break;
case 2:
machines[LINE].purchaseDate.month = atoi(record.c_str());
break;
case 3:
machines[LINE].purchaseDate.day = atoi(record.c_str());
break;
case 4:
machines[LINE].purchaseDate.year = atoi(record.c_str());
break;
case 5:
machines[LINE].cost = atof(record.c_str());
break;
case 6:
machines[LINE].history.failRate = atof(record.c_str());
break;
case 7:
machines[LINE].history.downDays = atoi(record.c_str());
break;
case 8:
machines[LINE].history.lastServiced.month = atoi(record.c_str());
break;
case 9:
machines[LINE].history.lastServiced.day = atoi(record.c_str());
break;
case 10:
machines[LINE].history.lastServiced.year = atoi(record.c_str());
break;
}
record = "";
_getch();
}

tempChar = machineRecords.get();
if (machineRecords.fail())
{
cout << "DONE" << endl;
break;
}
else
{
machineRecords.putback(tempChar);
}

++LINE;
_getch();
} while (!machineRecords.eof());    //While not at the end of the file

recordFromLastDate(1999);

machineRecords.close();
_getch();
return 0;
}

Любые ошибки форматирования являются проблемой SO.

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

К сожалению, у меня нет времени переписывать слишком много кода из-за тонны других проектов для среднесрочных целей, но я действительно хотел знать, делал ли я что-то совершенно неправильно или что-то в этом роде.

0

Решение

EOF устанавливается только когда вы читаете символ за концом файла, поэтому стоит подумать, что EOF будет установлен после machineRecords.get() что вы никогда не проверяете его возвращаемое значение, поэтому последующее чтение установит бит сбоя потока, а EOF будет проигнорировано. просто результат теста machineRecords.get() с -1, чтобы поймать EOF или ошибку, прежде чем продолжить

1

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

Я думаю, что вы должны попробовать что-то вроде,

char ch;
ifstream ifile("filename");

ifile.get(ch);   /*Called as prime read. Use getline() or ifile>>line where line is a string depending on your requirement*/
while(ifile)
{
do your work;//
......
......
......
ifile.get(ch);
}

Это работает почти во всех типах файлов. Сначала он получает данные из потока, а затем проверяет состояние потока в начале while Если произойдет сбой, он сразу выполнит оператор после while цикл в противном случае будет продолжаться до EOF достигается, когда поток переходит в состояние сбоя.

1

Вы должны использовать

} while (!machineRecords.good());

как ваше окончательное состояние.

Он охватывает eofbit, failbit и badbit, а не просто eofbit, поэтому цикл также завершается, если eof не достигнут, потому что чтение не было выполнено раньше.

Вы можете посмотреть это здесь: http://www.cplusplus.com/reference/iostream/ios/good/

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