c++ - window如何判断cin输入流的结束?
大家讲道理
大家讲道理 2017-04-17 14:23:19
0
2
612
大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回覆(2)
左手右手慢动作

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

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

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

大家讲道理
  • 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 是什麼?

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!