如何把EOF(档案结尾)放入code :: blocks?

问题描述:

#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; 
}  

我构建并运行此代码,并在第19行说明“EOF尚未声明”,即带有while标头的行。我一个一个地输入了确切的代码。如何把EOF(档案结尾)放入code :: blocks?

+3

开始这有什么好做的代码:: Blocks的 –

+0

http://stackoverflow.com/help/on-topic“问题要求我们推荐或找到一本书,工具,**软件库**,教程或其他非现场资源,都是针对堆栈溢出的话题......“[**重点**添加] –

+0

'while( = cin.get())!= EOF)'告诉我你在哪里学习/阅读,这是如何使用C++ I/O流? –

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

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

+0

EOF应该表示文件结束。将它作为输入是没有意义的。 –

+0

应该有一个文件在C++中开始,因为没有文件流或文件声明eof应该充当char而不是文件结尾。 – Mayank

+0

标准输入是cin引用的内容,就像C++中的文件一样,即使它不是常规的磁盘文件。 –

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

如果您更换一个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)) { 
+0

你可以更进一步,到达通常的C++输入循环while(cin.get(grade)){...' – Cubbi

+0

哦,你是对的。我没有在while中逐字符输入。 –