私のプログラムでは、stdoutをファイル「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())
その場合、ループは実行されないと思いますが、実行されます。ファイルには常に少なくとも1行、場合によっては2行の余分な空白行があり、入力がファイルから読み取られるとき、入力行は2つの空白行の間に挟まれます。この関数を数回呼び出した後、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)
誰かが私がここで間違っていることを見ることができますか?
編集:Amardeepが提案したように、私はwhile(!log.eof())
ループをループに変更しましたdo{...}while(!log.fail);
。これにより、無限ループの問題は修正されましたが、無関係な行は修正されませんでした。プログラムは以前と同じように動作しますが、一度無限ループに入った場合を除いて、次のように、入力を読み取る必要がある空白行のみを読み取ります。
str:
str:
str:
str:
(etc.)