我正在阅读文件,但在阅读时,它正在阅读最后一个字符吗?

时间:2011-11-07 18:43:09

标签: c++

我正在尝试通过以下代码来读取文件

void main()
{ 
   int i=0;
   ifstream fout1 ("Aj.txt",ios::binary);
   if (fout1.is_open())
   {
      while(fout1)
      {
         i++;
         fout1.get(ch1);
         cout<<ch1;
      }
      cout<<i;
      fout1.close();
    }
    else
    { 
       cout << "Unable to open file";
    }
    return 0;
 }

这里这段代码读取整个文件,但它会在一个额外的时间进入循环,即如果文件中有4个字符,那么在循环中它将迭代5次。如何纠正或克服它。

3 个答案:

答案 0 :(得分:3)

该代码读取直到设置eof标志,但在读取实际失败之前不会设置eof标志。这意味着当fout1.get(ch1)读取最后一个字符时,eof尚未设置 。因此它显示,并检查仍然良好的fout,因此它重新进入循环。然后fout1.get(ch1)因eof而失败,并再次显示先前的ch1值。编写该循环的正确方法是:

while(fout1.get(ch1)) {  //false when it can't read any more characters
    i++;
    cout<<ch1;
}
cout<<i;
fout1.close();

答案 1 :(得分:2)

读取第4个字符后,流仍然处于良好状态,因此它会尝试读取第5个字符,并在此时遇到文件结尾。您应该在调用get后检查流状态。例如:

while( fout1.get(ch1) )
{
    cout << ch1;
    ++i;
}

答案 2 :(得分:0)

如果您不熟悉iostream,这是一个很容易犯的错误。如果您只是读取文件中的最后一个字符,则stream.eof() false 。只有在尝试阅读过去文件末尾时才会成立。你需要一个如下所示的内部循环:

for (;;)
{
    fout1.get(ch1);
    if (!fout1) break;
    cout << ch1;
    i++;
}