C++ 中的文件结尾

2024-03-03

我有一个 n 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( ));    

}

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

感谢致敬!


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

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 才为真AFTER你试着读过去。文件中没有剩余字符可供读取与 EOF 为 true 不同。因此,您读取了最后一行并获取了值,并且没有任何内容可供读取,但 EOF 仍然为 false,因此代码重新进入循环。当它尝试读取 c_tmp 时,EOF 就会被触发,你的断言就会变成梨形。

解决办法就是把read作为while条件。读取的结果是流。但是,当在布尔上下文(例如 while 条件)中使用流时,它会转换为可以像 bool 一样使用的类型(从技术上讲,它是 void*,但这并不重要)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 中的文件结尾 的相关文章

随机推荐