Visual C++ 6.0 を使用しており、fstream を使用して、実行時にのみ作成されるファイルを開いて読み取ろうとしています。このファイルは、別のスレッドで実行されている別の関数によって書き込まれます。私のプログラムは、ファイルを開くことができるまで、つまりファイルが作成された後、ファイルから 3 つの数値を読み取り、残りのコードを実行しようとします。
ファイルtest.txt
にはコンテンツがあります
1
3
4
ファイルをポーリングして開く私のプログラムは次のとおりです。
ifstream fin;
std::string tfile, snum1, snum2, snum3;
long int num2, num3;
tfile.assign(argv[1]);
printf("Begin prog %s\n", tfile.c_str());
fp: fin.open(tfile.c_str(), ifstream::in);
if (fin.is_open())
{
printf("fin is open\n");
getline(fin, snum1);
getline(fin, snum2);
getline(fin, snum3);
num2 = atol(snum2.c_str());
num3 = atol(snum3.c_str());
printf("snum1 = %s\n", snum1.c_str());
printf("num2 = %ld num3 = %ld\n", num2, num3);
fin.close();
}
else
{
printf("Cannot open file %s\n", tfile.c_str());
fin.close();
Sleep(500);
goto fp;
}
remove(tfile.c_str());
printf("End of prog\n");
私はプログラムを実行しました
test_prog.exe "C:\test.txt"
test.txt
ファイルを入れる前に約3秒待ったC:\
私の出力は
Begin prog C:\test.txt
Cannot open file C:\test.txt
Cannot open file C:\test.txt
Cannot open file C:\test.txt
Cannot open file C:\test.txt
Cannot open file C:\test.txt
Cannot open file C:\test.txt
fin is open
snum1 =
num2 = 0 num3 = 0
End of prog
フォルダーを更新すると、test.txt
ファイルが消えC:\
ます。
そのため、あたかもファイルが正しく読み取られなかったかのように、snum1、num2、および num3 の値はすべて間違っています。
そのブロック全体の後に (num2 と num3 の値を出力するまで)while fin.good()
ループを置くと、次のようになります。printf("fin is open\n");
Begin prog C:\test.txt
Cannot open file C:\test.txt
Cannot open file C:\test.txt
Cannot open file C:\test.txt
Cannot open file C:\test.txt
Cannot open file C:\test.txt
Cannot open file C:\test.txt
fin is open
End of prog
実行時にのみ作成されるファイルを正しく読み取るにはどうすればよいですか?
ETA: 私も追加しました
if (fin.rdstate() & ifstream::failbit) != 0)
printf("failbit set\n");
printf("fin is open\n");
行の直後を確認failbit
し、実行時にファイルがフォルダーに配置されたときに設定されました。
実行前にファイルが配置されている場合、すべてが正しく実行されます。