簡體   English   中英

標准輸入流 (stdin) 的文件結尾 (EOF)

[英]End of File(EOF) of Standard input stream (stdin)

stdin 有 EOF 嗎? 例如,如果我使用freadread從 stdin 開始read ,那么以下循環會結束嗎?

while ((c = read(0, buffer, BUFSIZ)) > 0) {
    .
    .
    .
}

如果這個問題的答案是否定的,那么有沒有辦法將 EOF 添加到標准輸入中?

談到標准輸入中的EOF :當您從文件重定向輸入時,例如:

program <input.txt

該文件已經有一個EOF ,所以這不是問題。 在控制台中,您可以模擬EOF標志。 在 UNIX 系統中是Ctrl + D ,在 Windows 中是Ctrl + Z 當您在控制台中鍵入此內容時,程序的行為就像剛剛到達輸入文件的末尾一樣。


編輯

根據OP提出的一個問題:

那么這是否意味着標准輸入沒有 EOF,我們必須使用 Ctrl+Z 或 Ctrl+D 手動插入它們?

其實,是。 人們可能會將 stdin(未重定向,而是從控制台獲取)視為無限文件——沒有人知道它在哪里結束。 輸入文件的結尾,其中 input ist stdin,必須通過Ctrl + DCtrl + Z從字面上告訴。

我從來沒有在 Windows 中編寫過 C,所以我不能告訴你,但是在 bash 中,當你輸入數據結束時,程序會得到一個 EOF (Ctrl+D)

while ((c = read(0, buffer, BUFSIZ)) > 0) {

您沒有說c的類型,但使用該名稱意味着它是一個char 請注意,iosteams 的 EOF 值是(int) -1 將其存儲到無符號字符中將使您獲得與 EOF 不匹配的 255 值。

首先 getchar() 實際上是 getc(stdin) 所以 getc(FILE) 你可以從中閱讀更多。 getchar() 從輸入流或標准輸入中獲取最后一個未處理的字符,按 Enter 是 '\\n'。 如果標准輸入為空 getchar 強制暫停以獲取輸入。 說在一個程序中,我首先調用 getchar() 標准輸入是空的,所以它暫停輸入。 如果我輸入 ab'\\n',第一個 getchar() 將得到 97 'a' 的 ascii。 下次我調用 getchar() 時,我將得到 b ,然后 getchar() 將再次得到 '\\n'。

為了證明這一點,請編寫此代碼。

    int choice;

    do
   {
      cout << "Enter input:" ;
      choice = getchar(); 
      cout << "Last getchar(): " << choice << ":" << (char) choice ; 
       if( choice == '0' || choice == EOF)
         {
           cout << "Exited loop" << endl;     // EOF is ctrl+z in windows 
           break;
         }

   }while(true);

我確實相信 stdin 是全局的,因此在調用 getchar() 或類似函數以清除流之前,字符會保留在那里,如果您在其他地方使用 getchar() 可能會在以后導致錯誤。 正如人們所提到的,您可以使用 gets(char[]) 將所有字符直到換行符放入字符數組中。 問題是你需要一個比輸入大的 char[] 否則你會得到錯誤。 好消息是 gets(char[]) 確實清除了標准輸入,因此您可以制作一個笨拙的緩沖區來清除標准輸入或處理它。

我希望這是信息性的。

測試EOF的方法是檢查fread的返回值,然后使用feof:

while( fread( ... ) ) {    // loop so long as fread does not return zero
    // do something
}

if ( feof( stdin ) ) {
   // read failed because of EOF
}
else {
   // some other error
}

您的解決方案被標記為 C++,所以這里有一些 C++。

std::string lols;
while(!(std::cin >> lols).eof()) { // This loop will end when EOF is reached
    // Process string
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM