В моей программе я перенаправил стандартный вывод для печати в файл 'console.txt'.Функция пишет в этот файл так:
void printToConsole(const std::string& text, const TCODColor& fc, const TCODColor& bc)
{
// write the string
cout << text << "@";
// write the two color values
cout << static_cast<int>(fc.r) << " "
<< static_cast<int>(fc.g) << " "
<< static_cast<int>(fc.b) << " "
<< static_cast<int>(bc.r) << " "
<< static_cast<int>(bc.g) << " "
<< static_cast<int>(bc.b) << " " << endl;
}
У меня есть функция, которая читает из этого файла, который выглядит следующим образом:
void Console::readLogFile()
{
ifstream log("console.txt", ifstream::in);
if(!log.is_open())
{
cerr << "ERROR: console.txt not found!" << endl;
return;
}
// read new input into the stack
char str[256];
while(!log.eof())
{
log.getline(str, 256);
cerr << "str: " << str << endl;
stk.push(static_cast<string>(str));
// stk is a std::stack<std::string> member of the class this function
// belongs to.
}
cerr << endl;
/* Do some stuff with str and stk here */
log.close();
clearLogFile();
}
void Console::clearLogFile()
{
FILE* log;
log = fopen("console.txt", "w");
fclose(log);
}
Часто console.txt пуст, когда readLogFile
называется.Я ожидаю, что цикл while(!log.eof())
никогда не будет выполняться в этом случае, но он выполняется.В файле всегда есть хотя бы одна посторонняя пустая строка, иногда две, и когда входные данные считываются из файла, строка ввода помещается между двумя пустыми строками.После нескольких вызовов этой функции цикл while(!log.eof())
переходит в бесконечный цикл, вытаскивая пустые строки из файла.Типичный прогон программы выглядит следующим образом:
str:
str: Player moved.@191 191 191 0 0 0
str:
str:
str: Player moved.@191 191 191 0 0 0
str:
str: // there should be a 'Player moved.' line in here
str:
str: // here as well
str:
str: // also here
str:
str:
str: Player moved.@191 191 191 0 0 0
str:
str:
str:
str:
str:
str:
str:
(onto infinite loop)
Кто-нибудь может увидеть, что я здесь делаю неправильно?
РЕДАКТИРОВАТЬ: Как предложил Амардип, я изменил цикл while(!log.eof())
наdo{...}while(!log.fail);
петля.Это решило проблему бесконечного цикла, но не посторонние линии.Программа ведет себя так же, как и раньше, за исключением того, что когда-то она вошла в бесконечный цикл, теперь она читает только пустые строки, где она должна читать ввод, например:
str:
str:
str:
str:
(etc.)