gpt4 book ai didi

c++ - c++文件读写

转载 作者:搜寻专家 更新时间:2023-10-31 02:18:30 24 4
gpt4 key购买 nike

#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-key ('\n') 的代码也会在输入缓冲区。

如果您不从输入缓冲区中删除此 '\n',则在循环的下一次迭代中 cin.get(name,30); 将读取此内容name 的单个字符。

这是当 markschar 时的示例。

如果输入不正确,例如用户输入

  4vv6s5

作为标记(并且marks变量是float类型)4将被带到marks,和 "vv6s5" 到下一个学生的 name

因此在输入后清理输入缓冲区的更好方法如下:

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

关于c++ - c++文件读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34460795/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com