如何将EOF(文件末尾)放在code :: blocks中?

时间:2017-05-12 15:57:29

标签: c++ 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 << "\n\nTotal for each letter grade are:"
         << "\nA: " << aCount
         << "\nB: " << bCount
         << "\nC: " << cCount
         << "\nD: " << dCount
         << "\nF: " << fCount << endl;

                return 0;
}    

我构建并运行它并且它说'#34; EOF尚未宣布&#34;在第19行,即带有while标题的行。我逐个输入了确切的代码。

2 个答案:

答案 0 :(得分:1)

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

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

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

它应该工作得更好(在这种情况下你也应该删除最初的grade声明,因为它只在循环中使用,应该在那里声明)。

编辑:

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

开始
while (cin.get(grade)) {

答案 1 :(得分:-2)

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

在上面一行中,您只是将成绩作为输入。 EOF也应该有cin.get(),除非它不起作用。 当你这样做时,你需要首先将EOF声明为char,就像在上面的行中一样,比较是在两个字符之间。