2017-11-11 113 views
0

我现在面临的问题不是表现在++代码的代码块... 这里是代码:而(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 

所以,我的问题是,为什么是越来越重复的最后一条语句?......请帮助

+0

你可以有一个bash让代码可读 –

+1

请改善代码缩进 – mpromonet

回答

1

代码while(f)是隐式通过f致电std::basic_ios::operator boolf铸造成bool

在这种情况下,只要没有读取该流的错误,operator bool将返回true

当您的代码到达文件末尾时,循环测试将调用operator bool,并且它将返回true,因为迄今为止没有错误。然后它会调用f.read,这会触发错误,因为它试图读取文件的末尾。

由于流现在处于错误状态,因此f.read将不会更新传递给它的缓冲区,因此缓冲区仍将具有上次调用中返回的数据。这就是最后一个值重复的原因。

现在,当再次执行循环测试时,operator bool将返回false,因为流处于错误状态,并且循环将终止。

我看到这个错误很多在初学C++代码。我做了同样的事情,直到我学会了iostream的工作方式。我认为这种情况往往发生在有人在阅读之前从某种惯用语言来测试某种文件结束功能的时候。大多数时候,我已经看到iostream的eof函数被用作循环测试。这会导致相同的问题,因为eof不会告诉您已到达流的末尾。它告诉你,你已经试图读过它。

C++ iostreams的设计使您可以对读取操作的结果进行循环测试。

2

这是因为f只会在后设置为false由于eof,将失败。

试试这个方法:

while(f.read((char *)& ob1,sizeof(ob1))) { 
    ob1.putdata(); 
} 
-2

那是因为你之前出的数据,你必须,如果“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;} 
+0

请参阅[为什么iostream :: eof内循环条件被认为是错误的?](https://stackoverflow.com/questions/5605125/) –