在以下简单的代码段中,按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
答案 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;为您的学生结构。 我很抱歉我的英语,希望你能清楚。