0

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し、実行時にファイルがフォルダーに配置されたときに設定されました。

実行前にファイルが配置されている場合、すべてが正しく実行されます。

4

1 に答える 1

0

私はついに問題を見つけました。

failbit最初の失敗後に設定され、成功したfin.openときにリセットされることはありませんでした。ループでアフターを実行すると、プログラムfin.openは正常に実行されました。fin.clear()fin.close()else

于 2012-11-21T04:05:31.880 に答える