C++中的文件结束

Tim*_*Tim 3 c++ eof

我有一个X 2矩阵存储在文本文件中.我尝试用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( ));    

}
Run Code Online (Sandbox Code Playgroud)

当nb_try == n时,第一个断言错误,即fin.fail()为true,当它尝试读取不存在的第一个数字时发生.但是,读完最后一个数字后,fin.eof()怎么回事?这是否意味着只有在读取存在的第一个数字时它才变为真?fin.fail()和fin.eof()同时变为true也是如此吗?

感谢致敬!

Mar*_*ork 13

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

while (!fin.eof( ))
{
      // readLine;
      // Do Stuff
}
Run Code Online (Sandbox Code Playgroud)

标准模式是:

while(getlineOrValues)
{
    // Do Stuff
}
Run Code Online (Sandbox Code Playgroud)

因此,快速查看您的代码,我认为将其编写为更为简单:

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++;   
} 
Run Code Online (Sandbox Code Playgroud)

问题是EOF只有在您尝试阅读之后才会成立.在文件中没有留下要读取的字符与EOF为真是不一样的.因此,您阅读最后一行并获取值,并且没有任何内容可供阅读,但EOF仍为假,因此代码重新进入循环.当它尝试并读取c_tmp时,EOF会被触发,你的断言会变成梨状.

解决方案是将读取作为while条件.执行读取的结果是流.但是当在布尔上下文中使用流(例如while条件)时,它将被转换为可以像bool一样使用的类型(从技术上讲,它是一个void*但这并不重要).

  • 当你尝试阅读__past__ EOF时,EOF是真的.读到文件末尾不会改变状态.因此,当您读取文件末尾之后不存在的第一个值时,EOF将变为true. (2认同)

bam*_*ams 5

IIRC,直到您实际尝试读取文件末尾之后,eofbit 才会被设置。也就是说,一旦到达文件末尾,您必须再读一次才能设置该标志。