2013-10-15 52 views
3

我知道使用ctrl-z來表示EOF或EOT通常是過時的並且不推薦,但我只是對引擎蓋下發生的事情感到好奇。爲什麼只有在Windows控制檯程序中按Ctrl + Z時纔會終止輸入?

說我在C這樣的事情++:

#include <iostream> 
#include <string> 

int main() { 
    while (!cin.eof()) { 
     string str; 
     getline(cin, str); 
    } 
    cout << "out of while" << endl; 
    return 0; 
} 

如果我做ABC [^ Z] [換行符],程序仍然運行。相同的abc [^ D] [新行]。

但是,如果我輸入一行純粹包含[^ Z] [換行符],程序就會正常存在。

我知道這可能是操作系統特定的,但我只是對那裏發生的事情感到好奇。

+0

Windows/DOS在命令行中不是很有用。嘗試詢問Cygwin/MSYS人員關於他們嘗試使程序在bash和cmd.exe上運行的經驗。順便說一句,'while(!cin.eof())'是不好的形式;不會改變你的結果,但幾乎在任何情況下都是不正確的。 – DanielKO

回答

1

首先,這篇文章中有一些優秀的洞察按Ctrl-Z(DOS/Windows),然後按Ctrl-d(UNIX/Linux的):http://latedev.wordpress.com/2012/12/04/all-about-eof/

這是很值得一讀。它還指出了上述while循環的一個問題。

最重要的是,Ctrl-Z不表示EOF。但是,當它是行中的第一個字符時,大多數從控制檯讀取的Windows程序都會將其識別爲輸入的結尾。結果實際上是cin上的EOF。事實上,以文本模式打開的文件可能的行爲方式相同,但C++標準中沒有要求它們。

請注意,歷史上,輸入結束的Ctrl-Z必須位於行首。該行其他地方的Ctrl-Z沒有相同的效果。

相關問題