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 的值都是错误的,就好像文件没有被正确读取一样。

如果我在整个块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在运行时将文件放入文件夹时设置。

当文件在执行前就位时,一切都运行正常。

4

1 回答 1

0

我终于找到了问题所在。

是在第failbit一次fin.open失败后设置的,并且在fin.open成功时从不重置。一旦我在循环中做了一个fin.clear()之后,程序就成功运行了。fin.close()else

于 2012-11-21T04:05:31.880 回答