我有一个 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(使用前将#替换为@)