Так что, в основном, я пишу программу для сбора набора данных и ввода результатов в вектор структур. Однако проблема, с которой я сталкиваюсь, заключается в том, что флаг конца файла никогда не устанавливается в цикле 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. Я действительно понятия не имею, почему бы и нет.
К сожалению, у меня нет времени переписывать слишком много кода из-за тонны других проектов для среднесрочных целей, но я действительно хотел знать, делал ли я что-то совершенно неправильно или что-то в этом роде.
EOF устанавливается только когда вы читаете символ за концом файла, поэтому стоит подумать, что EOF будет установлен после machineRecords.get()
что вы никогда не проверяете его возвращаемое значение, поэтому последующее чтение установит бит сбоя потока, а EOF будет проигнорировано. просто результат теста machineRecords.get()
с -1, чтобы поймать EOF или ошибку, прежде чем продолжить
Я думаю, что вы должны попробовать что-то вроде,
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
достигается, когда поток переходит в состояние сбоя.
Вы должны использовать
} while (!machineRecords.good());
как ваше окончательное состояние.
Он охватывает eofbit, failbit и badbit, а не просто eofbit, поэтому цикл также завершается, если eof не достигнут, потому что чтение не было выполнено раньше.
Вы можете посмотреть это здесь: http://www.cplusplus.com/reference/iostream/ios/good/