В моей программе я перенаправил стандартный вывод для печати в файл '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 Console
string str;
while(getline(log, str))
{
cerr << "str: " << str << endl;
/* do stuff with str here */
}
cerr << endl;
log.close();
clearLogFile();
}
void Console::clearLogFile()
{
ofstream("console.txt", ios_base::trunc);
}
Первый раз через readLogFile
,все отлично работаетОднако потом у него начинаются проблемы.В первой строке console.txt он будет читаться как пустая строка.Я прошел программу с открытым console.txt в gvim и посмотрел, как он изменился.Первый раз, когда он работал правильно, console.txt выглядит примерно так:
1 moved UP.@191 191 191 0 0 0
2 Player moved.@191 191 191 0 0 0
~
~
, что и должно быть.Затем программа переходит на clearLogFile
, а затем console.txt пуст.Однако во второй раз, когда я открываю ifstream
, console.txt выглядит так:
1 ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@moved UP.@191 191 191 0 0 0
2 Player moved.@191 191 191 0 0 0
~
~
На этот раз, когда getline
читает первую строку в str
, str
пустоСтранно, но строка cerr << "str: " << str << endl;
по-прежнему печатает str
как "перемещено вверх. @ 191 191 191 0 0 0", хотя проверка str
в gdb показывает, что она пуста.
Кто-нибудь знает, что происходитздесь