2017-11-11 185 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/) –