用c ++

时间:2015-12-25 07:10:00

标签: c++ c++11

#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)(我的教科书说要清除输入缓冲区)。这样做有什么帮助?我对清除缓冲区知之甚少,它如何影响以下迭代?

此外,如果我在用'\ n'写入文件时不分隔名称和标记怎么办? 而且,在阅读时我会像

一样阅读
fin>>get(name,30); 
fin>>marks; 

运行程序后,我注意到只有第一次迭代的值重复了5次。 为什么会这样?

1 个答案:

答案 0 :(得分:2)

让我们考虑以下两行

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

markschar的情况下。 由于来自cin>>operator的输入需要按来自用户的Enter,因此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');