[英]End of File(EOF) of Standard input stream (stdin)
stdin 有 EOF 嗎? 例如,如果我使用fread
或read
從 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 + D或Ctrl + 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.