C ++中的文件结尾

我有一个X 2matrix存储在一个文本文件中。 我尝试在C ++中读取它

nb_try=0; fin>>c_tmp>>gamma_tmp; while (!fin.eof( )) //if not at end of file, continue reading numbers { // store cs_bit.push_back(c_tmp); gammas_bit.push_back(gamma_tmp); nb_try++; // read fin>>c_tmp; assert(!fin.fail( )); // fail at the nb_try=n if(fin.eof( ))break; fin>>gamma_tmp; // get first number from the file (priming the input statement) assert(!fin.fail( )); } 

第一个断言失败,即fin.fail()是真实的,当nb_try == n,当它试图读取不存在的第一个数字时发生。 但是,在阅读最后一个数字后,fin.eof()怎么会不正确? 这是否意味着它只有在阅读不存在的第一个数字时才成立? fin.fail()和fin.eof()同时变为真,这是真的吗?

感谢致敬!

这是读取文件的错误方法:

 while (!fin.eof( )) { // readLine; // Do Stuff } 

标准模式是:

 while(getlineOrValues) { // Do Stuff } 

所以快速查看您的代码我认为将它写为:

 while(fin>>c_tmp>>gamma_tmp) { // loop only eneterd if both c_tmp AND gamma_tmp // can be retrieved from the file. cs_bit.push_back(c_tmp); gammas_bit.push_back(gamma_tmp); nb_try++; } 

问题是EOF只有在尝试读取它之后才是正确的。 没有字符留在文件中读取是不一样的EOF是真实的。 所以你阅读最后一行并获取值,没有什么可读的,但EOF仍然是错误的,所以代码重新进入循环。 当它试图读取c_tmp时,EOF被触发,你的断言变成梨形。

解决的办法是把阅读作为一个条件。 读取的结果是stream。 但是当一个stream在布尔上下文中被使用时(比如while的条件),它被转换成可以像bool一样使用的types(从技术上说,这是一个void *,但那不重要)。

IIRC,eofbit不会被设置,直到你真的试图读取文件的末尾。 也就是说,一旦你到达文件的结尾,你必须再读一遍,然后才能设置标志。

如果文本文件包含此序列,不带引号“12345 67890”,则#3将返回false,但#4将返回true,因为在最后一个数字之后没有空格:

 int i; bool b; fin >> i; b = fin.fail(); // 1 b = fin.eof(); // 2 fin >> i; b = fin.fail(); // 3 b = fin.eof(); // 4 fin >> i; b = fin.fail(); // 5 b = fin.eof(); // 6 

但是,如果顺序是“12345 6789”(注意最后一个数字后面的空格),那么#3和#4将返回false,但是#5和#6将返回true。

你应该检查两者,eof()和fail(),如果两者都是真的,你没有更多的数据。 如果fail()为true,但eof()为false,则文件存在问题。