搜尋

首頁  >  問答  >  主體

c++ - window如何判断cin输入流的结束?

大家讲道理大家讲道理2885 天前675

全部回覆(2)我來回復

  • ringa_lee

    ringa_lee2017-04-17 14:25:19

    1.當ctrl Z單獨成行,或說它前面沒有任何字元(包括空格)時表示終止,其他情況他會被識別為一個無意義的字元。 windows下的定義,和程式無關。

    2.endl是刷新流。由於cin是遇到錯誤跳出的while循環,所以不用cin.clear()刷新狀態位元也是沒辦法重新進入輸入的。你第二個程式會輸出原來輸入的字母,不是因為資料還在流裡面,而是因為運行完第一個while,輸入資料被保存在了全域物件p2中,同時由於沒有重置狀態,程式直接跳過了第二個while循環,直接輸出了p2的內容

    解:兩個while循環間加入cin.clear()和cin.sync()(不想換行輸入ctrl+z還可以加個cin.ignore())

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 14:25:19

    • linxu :透過Ctrl+D設定EOF即可

    • windows 透過Ctrl+Z 設定EOF即可

    程式碼中加入cin.clear()

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main(){
        string p1, p2;
        
        cout << "first" << endl;
        while (cin >> p1){//
            p2 += p1;
        }
        cout << p2 << endl;
        
        cin.clear();//重新清空一下流的标志位,包括EOF
        
        cout << '\n' <<"second" <<endl;
        while (cin >> p1){
            p2 += p1;
        }
        cout << p2 << endl;
    
        return 0;
    }

    EOF的輸入

    • Linux中,在新的一行的開頭,按下Ctrl-D,就代表EOF(如果在一行的中間按下Ctrl-D,則表示輸出"標準輸入"的緩存區,所以這時必須按兩次Ctrl-D);

    • Windows中,Ctrl-Z表示EOF。 (順便提一句,Linux中按下Ctrl-Z,表示將該進程中斷,在後台掛起,用fg命令可以重新切回到前台;按下Ctrl-C表示終止該進程。)

    那麼,如果真的想輸入Ctrl-D怎麼辦?這時必須先按下Ctrl-V,然後就可以輸入Ctrl-D,系統就不會認為這是EOF訊號。 Ctrl-V表示以"字面意義"解讀下一個輸入,如果想按"字面意義"輸入Ctrl-V,連續輸入兩次就行了。

    引用自 阮老師的 EOF 是什麼?

    回覆
    0
  • 取消回覆