我正在使用Visual C ++ 6.0,我正在尝试使用fstream打开并读取仅在运行时创建的文件。该文件由另一个在另一个线程上运行的函数编写,我的程序将继续尝试“打开”该文件,直到它被打开,即在它被创建之后,然后从中读取3个数字并执行其余的代码。 / p>
文件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"
并等待约3秒钟,然后将test.txt
文件放入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的值都是错误的,就像文件没有被正确读取一样。
如果我在while fin.good()
之后为整个块放置一个printf("fin is open\n");
循环(直到打印num2和num3的值),那么我得到
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
。
在执行文件之前,一切都正常运行。
答案 0 :(得分:0)
我终于找到了问题。
failbit
在第一个fin.open
失败后设置,并且在fin.open
成功时从未重置。在fin.clear()
循环中fin.close()
后else
进行{{1}}后,程序成功运行。