如何将EOF(文件结尾)放入代码::块中?


#include <iostream>
using std::cout;
using std::cin;
using std::endl;
int main()
{
int grade,
aCount = 0,
bCount = 0,
cCount = 0,
dCount = 0,
fCount = 0;
cout << "Enter the letter grades." << endl
<< "Enter the EOF character to end input." << endl;
while ( ( grade = cin.get() ) != EOF ) {
switch ( grade ) {
case 'A':
case 'a':
++aCount;
break;
case 'B':
case 'b':
++bCount;
break;
case 'C':
case 'c':
++cCount;
break;
case 'D':
case 'd':
++dCount;
break;
case 'F':
case 'f':
++fCount;
break;
case 'n':
case 't':
case ' ':
break;
default:
cout << "Incorrect letter grade entered."
<< " Enter a new grade." << endl;
break;
}
}    
cout << "nnTotal for each letter grade are:"
<< "nA: " << aCount
<< "nB: " << bCount
<< "nC: " << cCount
<< "nD: " << dCount
<< "nF: " << fCount << endl;
return 0;
}    

我构建并运行它,它在第 19 行显示"EOF 尚未声明",即带有 while 标头的行。我一一输入了确切的代码。

EOF宏在cstdio中定义,但通常使用C++式 IO 比使用 C 式 IO 更好。与其检查返回值以查看它是否EOF,不如检查cin.eofbit(或者,由于可能存在其他问题,因此cin.failbit)。您可以通过尝试将其评估为bool来检查流的failbit,如下所示。

如果将 while 循环替换为 for 循环,则为

for (char grade = cin.get(); cin; grade = cin.get()) {

它应该工作得更好(在这种情况下,您还应该摆脱初始grade声明,因为它仅在循环中使用,应该在那里声明)。

编辑:

这可以进一步简化。get方法支持传入字符引用,因此可以调用cin.get(grade)而不是grade = cin.get()。这样做的优点是,当传递字符引用时,get返回流的副本,因此您可以同时执行读取和检查状态。使用此方法,需要提前声明grade,但循环可以以

while (cin.get(grade)) {
while ( ( grade = cin.get() ) != EOF ) {

在上行中,您仅将成绩作为输入。 EOF也应该有一个cin.get(),除非它不起作用。 执行此操作时,您需要首先将EOF声明为char,因为在上行中,比较是在两个字符之间。

最新更新