2016-04-21 38 views
0

我想從標準輸入中讀取一些數字,處理它們,然後讀取下一串數字。從std :: cin讀取多次 - 在Linux和Mac OS X上有不同的行爲

我想出瞭解中的EOF字符並清除eofbit,failbit和badbit的解決方案。下面的代碼工作在Ubuntu 14.04與GCC 4.9.2:

#include <iostream> 
#include <vector> 

int main() { 
    std::vector<double> a; 
    std::vector<double>::iterator it; 
    double x; 
    while(std::cin >> x) { 
     a.push_back(x); 
    } 
    std::cout << "First bunch of numbers:" << std::endl; 
    for (it = a.begin(); it != a.end(); ++it) { 
     std::cout << *it << std::endl; 
    } 

    // get crap out of buffer 
    char s; 
    std::cin >> s; 
    std::cin.clear(); 

    // go for it again 
    while (std::cin >> x) { 
     a.push_back(x); 
    } 
    std::cout << "All the numbers:" << std::endl; 
    for (it = a.begin(); it != a.end(); ++it) { 
     std::cout << *it << std::endl; 
    } 

    return 0; 
} 

所以,在Ubuntu上我可以輸入1<Return>2<Return>^D,得到一些輸出,類型3<Return>4<Return>^D,獲得更多的產出和程序終止。

在Mac OS 10.10然而,使用相同版本的GCC,該程序將不接受第二輪輸入,但打^D後第一時間的兩倍數的第一序列輸出。

  • 爲什麼會有不一致的行爲?是否有可能解決它?
  • 慣用的接受兩次輸入的方式是什麼?
  • 在我的使用案例中,第一批數字最終可能會從文件或管道中讀取。我怎樣才能在該場景中交互式地要求額外的輸入。
+0

也許嘗試調用'的std :: cin.clear()'發送後使用它之前, 「EOF」是第一次? – Galik

+0

這是控制檯行爲,而不是C++代碼。在MacOS中,它可能在發送EOF之後關閉輸入流[就像在Windows中一樣](http://stackoverflow.com/questions/10147996/resume-reading-from-iostreamcin-after-ctrlz-eof-ignore-doesnt-work?rq = 1) –

回答

0

我不是所有熟悉不過了,這傢伙也有類似的問題:Signal EOF in mac osx terminal

默認情況下,在開始按下控制d OS X(以前的Mac OS X)終端EOF認識一條線。

具體來說,實際操作是,當按下control-D時,終端輸入緩衝區中的所有字節將被髮送到使用終端的正在運行的 進程。在一行的開始處,緩衝區中沒有字節,因此該過程被告知有零字節可用,並且 這充當EOF指示符。

此過程兼作線的端部之前遞送輸入到過程 的方法:用戶可以鍵入一些字符,然後按 控制-d,和字符將不立即被髮送到過程中, 通常等待輸入/返回被按下。在這個 「立即發送所有緩衝的字節」操作被執行之後,沒有字節 留在緩衝區中。因此,當第二次按下control-D時,它與一行的開始處相同(不發送字節, 進程爲零字節),並且它的行爲類似於EOF。

通過在終端中使用命令「man 4 tty」,可以瞭解有關終端行爲的更多信息。默認的線路規程是termios。您可以通過使用命令「man termios」來了解有關termios line紀律的更多信息。

埃裏克Postpischil

接受的答案

我沒有OSX要測試的,但也許這說明了其行爲