而(F)如预期使用本C
我现在面临的问题不是表现在++代码的代码块... 这里是代码:而(F)如预期使用本C
#include<iostream>
#include<fstream>
using namespace std;
class test {
int i;
float j;
public:
void getdata() {
std::cout<<"\nenter i and j:";
std::cin>>i>>j;
}
void putdata() {
std::cout<<"\ni="<<i<<"\tj="<<j;
}
};
int main()
{
test ob,ob1;
fstream f;
f.open("dil.txt",ios::out|ios::binary);
for(int i=0;i<5;i++)
{
ob.getdata();
f.write((char *)& ob,sizeof(ob));
}
f.close();
f.open("dil.txt",ios::in|ios::binary);
f.seekg(0);
while(f) {
f.read((char *)& ob1,sizeof(ob1));
ob1.putdata();
}
f.close();
return 0;
}
输入详细信息后,输出来了:
i=2 j=2.3
i=3 j=3.4
i=4 j=4.5
i=5 j=5.6
i=6 j=6.7
i=6 j=6.7
所以,我的问题是,为什么是越来越重复的最后一条语句?......请帮助
代码while(f)
是隐式通过f
致电std::basic_ios::operator bool
将f
铸造成bool
。
在这种情况下,只要没有读取该流的错误,operator bool
将返回true
。
当您的代码到达文件末尾时,循环测试将调用operator bool
,并且它将返回true
,因为迄今为止没有错误。然后它会调用f.read
,这会触发错误,因为它试图读取文件的末尾。
由于流现在处于错误状态,因此f.read
将不会更新传递给它的缓冲区,因此缓冲区仍将具有上次调用中返回的数据。这就是最后一个值重复的原因。
现在,当再次执行循环测试时,operator bool
将返回false
,因为流处于错误状态,并且循环将终止。
我看到这个错误很多在初学C++代码。我做了同样的事情,直到我学会了iostream的工作方式。我认为这种情况往往发生在有人在阅读之前从某种惯用语言来测试某种文件结束功能的时候。大多数时候,我已经看到iostream的eof
函数被用作循环测试。这会导致相同的问题,因为eof
不会告诉您已到达流的末尾。它告诉你,你已经试图读过它。
C++ iostreams的设计使您可以对读取操作的结果进行循环测试。
那是因为你之前出的数据,你必须,如果“F”读OEF 这样的代码控制:
#include<iostream>
#include<fstream>
using namespace std;
class test
{int i;float j;
public:
void getdata()
{std::cout<<"\nenter i and j:";
std::cin>>i>>j;}
void putdata()
{std::cout<<"\ni="<<i<<"\tj="<<j;}
};
int main()
{test ob,ob1;
fstream f;
f.open("dil.txt",ios::out|ios::binary);
for(int i=0;i<5;i++)
{ ob.getdata();
f.write((char *)& ob,sizeof(ob));
}
f.close();
f.open("dil.txt",ios::in|ios::binary);
f.seekg(0);
while(!f.eof())
{
f.read((char *)& ob1,sizeof(ob1));
if(!f.eof())
{
ob1.putdata();
}
}
f.close();
return 0;}
请参阅[为什么iostream :: eof内循环条件被认为是错误的?](https://stackoverflow.com/questions/5605125/) –
你可以有一个bash让代码可读 –
请改善代码缩进 – mpromonet