2015-12-25 52 views
2
#include<iostream> 
#include<fstream> 
using namespace std; 
int main() 
{ 
    ofstream fout("student",ios::out); 
    char name[30],ch; 
    float marks=0.0; 
    for(int i=0;i<5;i++) 
    { 
     cout<<"Stud"<<(i+1)<<":\tName"; 
     cin.get(name,30); 
     cout<<"\tMarks"; 
     cin>>marks; 
     cin.get(ch); 
     fout<<name<<'\n'<<marks<<'\n'; 

    } 
    fout.close(); 
    ifstream fin("student",ios::in); 
    fin.seekg(0); 
    cout<<"\n"; 
    for(int i=0;i<5;i++) 
    { 
     fin.get(name,30); 
     fin.get(ch); 
     fin>>marks; 
     fin.get(ch); 
     cout<<name<<marks; 
    } 
    fin.close(); 
} 

現在,有兩件事我不明白。爲什麼在寫入文件時需要cin.get(ch)(我的教科書說清除輸入緩衝區) 。這樣做有何幫助?我對清除緩衝區沒有太多知識,它如何影響以下迭代?用C++編寫的文件

此外,如果我在寫'\ n'的文件時沒有分開名稱和標記怎麼辦? 而且,在閱讀我讀它像

fin>>get(name,30); 
fin>>marks; 

在運行我注意到,只有第一次迭代的值被重複5次節目。 這是爲什麼呢?

回答

2

讓我們考慮以下兩行

cin >> marks; 
cin.get(ch); 

在此條件下,當markschar。 由於cin>>operator的輸入需要按用戶Enter,因此輸入密鑰('\n')的代碼也將在輸入緩衝區中。

如果您不從輸入緩衝區中移除'\n',則在您的循環的下一次迭代中,cin.get(name,30);會將此單個字符讀取到name

這是markschar時的例子。

如果輸入錯誤,例如用戶輸入

4vv6s5 

作爲標記(和marks變量是float類型)4將採取marks,並"vv6s5"到下一個學生的name

所以清潔輸入緩衝器輸入後就可以作爲一個更好的辦法如下:

cin >> marks; 
do{ 
    cin.get(ch); 
} while(ch != '\n');