指示文件结束

时间:2013-12-30 14:02:57

标签: c++ while-loop istream

在以下简单的代码段中,按ctrl-z即可轻松指示文件结尾。

double x;

while ( cin >> x )
{
    ++count;
    sum += x;
}

但是当我尝试更复杂的程序时,例如读取学生记录进行某些处理,我无法指示程序的文件结尾。

例如,我有一个名为struct的{​​{1}}对象

Student_info

我已经写了几个函数来读入和存储几个学生记录,如下所示:

struct Student_info
{
    string name;
    double midterm, final;
    vector<double> homework;
};

但输入一些学生记录后,当我while ( read( cin, record ) ) { students.push_back( record ); } 并按Enter键查看结果时,命令提示符仍在等待我。

我做错了什么?

p.s.1。我用空格分隔姓名和成绩,并通过跳到下一行分开学生的详细信息,这应该是相同的;即一些空间分隔物。正确?

ps2。此代码是从 Accelerated C ++ 手册中采用的,我对它的了解直到第5章才开始...

提前谢谢你,

修改

以下是我使用的另外两个功能:

ctrl-z

2 个答案:

答案 0 :(得分:3)

最简单的解决方案是编写std::istream& operator>> ( std::istream& in, Student_info&),其行为与现有operator>>类似。然后,您可以使用完全相同的循环:

Student_info record;
while ( cin >> record )
{
    ++count;
    students.push_back( record );
}

operator>>内,您应该为所有成员调用operator>>,然后返回istream& in参数。

答案 1 :(得分:2)

当cin读取EOF时,它只设置了instream标志eofbit和failbit。 当你使用

while(cin>>x)

,它隐式表示运算符bool(std :: cin),它在读取EOF时返回false(cin&gt;&gt; x返回cin)。因此while循环结束。

但是当你使用

while ( read( cin, record ) )

当读取EOF时,cin也会返回false,但是你的函数读取并没有识别它。当while循环继续时,循环会出现一个新的cin。 重要的是failbit标志将保存在你的流中,直到你使用cin.clear()。因此你的代码不如重载运算符&gt;&gt;为您的学生结构。 我很抱歉我的英语,希望你能清楚。