在我的程序中,我已将标准输出重定向到打印到文件“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 的第一行中读取为空白字符串。我通过在 gvim 中打开的 console.txt 逐步完成了程序,并监控了它是如何变化的。第一次,当它正常工作时,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
为“moved UP.@191 191 191 0 0 0”,尽管str
在 gdb 中检查显示它是空的。
有人知道这里发生了什么吗?