c++ - C++文件读写

标签 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 次。 为什么会这样?

最佳答案

让我们考虑以下两行

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

markschar的情况下。 由于 cin>>operator 的输入需要用户按 Enter 键,因此 Enter 键的代码 ('\n') 也将在输入缓冲区。

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

这是一个 markschar 情况的示例。

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

  4vv6s5

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

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

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

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

相关文章:

c++ - 在 C++ 类中使用线程的段错误

c++ - 文件流打不开

c++ - 将矩阵旋转 N 度

C++ 源文件包含 "Unique Mappings"?

c++ - 为什么我的 8M L3 缓存对大于 1M 的阵列没有任何好处?

c++ - 策略模式与继承

c++ - 如何在不捕获变量的情况下对 lambda 中的变量使用 decltype?

c++ - std::atomic 是否防止非原子变量在原子变量上的重新排序

c++ - 在不执行程序的情况下在 C++11 中检索 auto 的类型

c++ - 使用 CPU 缓存行击败二进制搜索