簡體   English   中英

從重定向到STDIN的文件中檢測C ++中的EOF

[英]Detecting EOF in C++ from a file redirected to STDIN

執行命令:

./program < input.txt

使用以下代碼檢查:

string input;
while(cin) {
  getline(cin, input);
}

上面的代碼似乎生成了一個額外的getline()調用,其中輸入為空。 無論input.txt的最后一行是否有\\n ,都會發生這種情況。

@Jacob有正確的解決方案但由於某種原因刪除了他的答案。 這是你的循環中發生的事情:

  1. 檢查cin是否有任何故障位(BADBIT,FAILBIT)
  2. cin報告沒有問題,因為尚未從文件中讀取任何內容。
  3. 調用getline ,檢測文件結束,設置EOF位和FAILBIT。
  4. 循環再次從1執行,除非它退出。

你需要做這樣的事情:

std::string input;
while(std::getline(std::cin, input))
{
     //Have your way with the input.
}

這個怎么樣:

string input;
while(getline(cin, input)) {
  //do something with input...
}

編輯:請注意,在下面的例子中,我向您展示“如何檢測EOF”。 正如@Billy指出的那樣,您可能希望使用good()而不是eof()來檢測任何錯誤條件 eof。 我在答案的最后列出了有關這方面的信息,但這很重要,所以我在頂部添加了這個注釋以確保它清楚。

(原始答案如下)


你要這個:

string input;
while( !cin.eof() ) {
   getline(cin, input);
}

使用operator! iostream僅檢查是否發生了故障或其他錯誤情況。 ios :: operator!()

您可以使用good()代替!eof()來檢查eofbadbitfailbit任何條件。 ios :: good()

暫無
暫無

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

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