#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 次。 为什么会这样?
最佳答案
让我们考虑以下两行
cin >> marks;
cin.get(ch);
在marks
为char
的情况下。
由于 cin
与 >>operator
的输入需要用户按 Enter 键,因此 Enter 键的代码 ('\n'
) 也将在输入缓冲区。
如果您不从输入缓冲区中删除此 '\n'
,则在循环的下一次迭代中 cin.get(name,30);
将读取此内容单个字符名称
。
这是一个 marks
是 char
情况的示例。
如果输入不正确,例如:用户输入
4vv6s5
作为标记(并且marks
变量是float
类型)4
将被带到marks
,和“vv6s5”
到下一个学生的姓名
。
因此,在输入后清理输入缓冲区的更好方法如下:
cin >> marks;
do{
cin.get(ch);
} while(ch != '\n');
关于c++ - C++文件读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34460795/