2017-05-12 18 views
1
#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流? –

回答

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

在上面的行中,您只是將等級作爲輸入。 EOF也應該有一個cin.get(),除非它不起作用。 當你這樣做時,你需要首先聲明EOF爲char,如上面的行中比較是在兩個字符之間。

+0

EOF應該表示文件結束。將它作爲輸入是沒有意義的。 –

+0

應該有一個文件在C++中開始,因爲沒有文件流或文件聲明eof應該充當char而不是文件結尾。 – Mayank

+0

標準輸入是cin引用的內容,就像C++中的文件一樣,即使它不是常規的磁盤文件。 –

1

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中逐字符輸入。 –