亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從文本文件中讀取,直到EOF重復最后一行

從文本文件中讀取,直到EOF重復最后一行

C++
Helenr 2019-06-21 15:12:44
從文本文件中讀取,直到EOF重復最后一行以下內容C+代碼使用如果流對象從文本文件(每一行有一個數字)中讀取整數,直到它命中。EOF..為什么它要讀取最后一行的整數兩次?怎么解決這個問題?代碼:#include <iostream>#include <fstream>using namespace std;int main(){     ifstream iFile("input.txt");    // input.txt has integers, one per line     while (!iFile.eof())     {         int x;         iFile >> x;         cerr << x << endl;     }     return 0;}輸入txt:10  20  30輸出量:10  20  30  30注:我跳過了所有錯誤檢查代碼,以保持代碼片段的小。在Windows(Visual C+)、cygwin(GCC)和Linux(GCC)上都可以看到上述行為。
查看完整描述

3 回答

?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

只要緊跟著一連串的事件就行了。

  • 抓10
  • 抓20
  • 抓取30
  • 抓斗EOF

看看第二次到最后一次迭代。你抓了30,然后繼續檢查EOF。您還沒有到達EOF,因為EOF標記還沒有被讀取(“二進制”而言,它的概念位置就在30行之后)。因此,您將繼續進行下一次迭代。與以前的迭代相比,X仍然是30。現在你從溪流中讀到,你得到了EOF。X保持為30,而IOS:eofbit被引發。您將輸出到stderrx(與上一次迭代一樣,這是30)。接下來,在循環條件下檢查EOF,這次是退出循環。

試試這個:

while (true) {
    int x;
    iFile >> x;
    if( iFile.eof() ) break;
    cerr << x << endl;}

順便說一下,您的代碼中還有另一個bug。你試過在一個空文件上運行它嗎?你所得到的行為也是出于同樣的原因。


查看完整回答
反對 回復 2019-06-21
?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

我喜歡這個示例,它現在省略了可以在while塊中添加的檢查:

ifstream iFile("input.txt");        // input.txt has integers, one per lineint x;while (iFile >> x) {
    cerr << x << endl;}

不確定它有多安全.。


查看完整回答
反對 回復 2019-06-21
?
慕碼人2483693

TA貢獻1860條經驗 獲得超9個贊

有另一種方法可以解決這個問題:

#include <iterator>#include <algorithm>// ...

    copy(istream_iterator<int>(iFile), istream_iterator<int>(),
         ostream_iterator<int>(cerr, "\n"));


查看完整回答
反對 回復 2019-06-21
  • 3 回答
  • 0 關注
  • 705 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號