根据你的建议我已按照你的建议更改了代码,但是当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
答案 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)
内从文件内部提取字符。关于堆栈溢出,我建议this或this个问题。
所以正确的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::out
,ios::in
是修饰符,用于说明我们如何打开相关文件。如果您想从文件中读取某些内容,则需要使用ios::out
标记,并且为了编写,您需要使用ios::in
。
另一方面,ios::ate
只是告诉编译器打开文件并立即转到文件末尾。因此,如果用ios::out
替换ios::ate
写入是不可能的,程序将在file << "Hello...";
上升起failflag。
如果你只是想附加数据,但是从文件的开头读取,你应该使用ios::app
,因为它告诉你在每次写入之前寻找eof。