到达eof后文件处理不能与fstream一起使用?

时间:2015-11-13 08:10:51

标签: c++ c++11

根据你的建议我已按照你的建议更改了代码,但是当ios :: out被ios替换时仍然存在问题:: ate文件中没有写入(写入不起作用)。有没有办法检查如果下一位是eof而不是读它然后检查它?正如你所建议的那样。有时当我进行文件处理时,它会显示文件指针的位置为-1,这意味着什么?

代码:

int main ()

{

    char p[80];
    fstream file("text1.txt",ios::out|ios::in); //if ios::ate is added here it results into infinite loop
    cout<<"Starting position of the file is "<<file.tellg()<<endl;
    getch();
    if(file.is_open())
        cout<<"file is open\n";
    else
        cout<<"file is not open\n";
    getch();
    file.seekp(0);
    while(file>>p)
    {
        cout<<p<<endl;
    }
    file.clear();
    cout<<"\nThe current position of the file pointer is "<<file.tellg()<<endl;
    file.seekp(0);
    if(file.eof())
        cout<<"\n the eof\n";
    while(file>>p)
    {
        cout<<p<<endl;
    }
    file.close();
    return 0;
}

输出:

Starting position of the file is 0
file is open
Hello
man
how
are
you

The current position of the file pointer is 21
Hello
man
how
are
you

1 个答案:

答案 0 :(得分:1)

通过这种文件读取到达文件结尾会导致设置eof和failbit。设置Failbit是因为创建具有file.eof()条件的读取循环并不表示下一次读取将是流的结束。它只是说我们还没有达到eof,所以:

while(file.eof())
{
file >> p;
}

最后一次阅读可能只是eof,我们将使用未初始化的数据。如果发生这种情况,将不会在p中提取任何字符,并且将设置eof和fail标志。

使用c ++ 98时,需要使用以下命令将failbit重置为false:

file.clear();

为避免读数错误,您应该在条件:while(file >> p)内从文件内部提取字符。关于堆栈溢出,我建议thisthis个问题。

所以正确的C ++ 98代码应如下所示:

while(file >> p)
{
  std::count << p << std::endl;
}
file.clear();
file.seekp(0);
while(file >> p)
{
  std::count << p << std::endl;
}
file.close();

我在Visual Studio 2013上测试过几次,每次都有效。

考虑ios::ate模式: ios::outios::in是修饰符,用于说明我们如何打开相关文件。如果您想从文件中读取某些内容,则需要使用ios::out标记,并且为了编写,您需要使用ios::in

另一方面,ios::ate只是告诉编译器打开文件并立即转到文件末尾。因此,如果用ios::out替换ios::ate写入是不可能的,程序将在file << "Hello...";上升起failflag。 如果你只是想附加数据,但是从文件的开头读取,你应该使用ios::app,因为它告诉你在每次写入之前寻找eof。