C 正確讀取檔案最後一行

2021-08-25 08:55:17 字數 1753 閱讀 8619

使用c++ ifstream來讀取檔案時,發現在讀到檔案結尾時會多讀一行。測試**如下,

#include

#include

#include

intmain

(void

) std::string oneline;

while

(inf.

eof()==

false

)return0;

}

data.txt內容如下,

輸出如下,多讀了一行,為空。

方法1直接判斷std::getline()的返回值,

#include

#include

#include

intmain

(void

) std::string oneline;

while

(std::

getline

(inf, oneline)

)return0;

}

方法2

使用檔案流的peek()方法來代替eof()方法,如下,

#include

#include

#include

intmain

(void

) std::string oneline;

while

(inf.

peek()

!=eof

)return0;

}

輸出如下,

可見最後一行得到了正確的處理。

方法3先呼叫std::getline()去讀取,然後先判斷eof()再決定是否列印,

#include

#include

#include

intmain

(void

) std::string oneline;

while

(true

)return0;

}

《c++ primer 5th》17.5.2節對檔案流的peek()方法描述如下,

peek返回輸入流中下乙個字元的副本,但不會將它從流中刪除。peek返回的值仍然留在流中。

所以,通過peek()來提前預判下乙個字元是不是檔案結束符eof,就可以讓我們提前知道檔案流是否已經到了結尾,就可以正確結束輸入。

為什麼eof()方法不行呢?下面來分析下,上面用於測試的data.txt,其實際結構如下,

檔案最後會有個eof(end of file)表示檔案內容的結束。

當使用std::getline()讀取完4444後,此時如果使用peek(),則返回值是eof,而peek()方法的功能是預判下乙個字元,由此可以知道std::getline()讀完4444後,檔案控制代碼的位置並不在eof處,而是在eof之前的那個字元位置上,此時使用eof()方法會返回false,然後呼叫std::getline()去讀取eof,就會導致錯誤,引數oneline就會變成空字串,所以就會多列印乙個空行。

python讀取檔案最後一行

處理檔案時,乙個常見的需求就是讀取檔案的最後一行。那麼這個需求用python怎麼實現呢?乙個樸素的想法如下 with open a.log r as fp lines fp.readlines last line lines 1 即使不考慮異常處理的問題,這個 也不完美,因為如果檔案很大,lines...

python讀取檔案最後一行

處理檔案時,乙個常見的需求就是讀取檔案的最後一行。那麼這個需求用python怎麼實現呢?乙個樸素的想法如下 with open a.log r as fp lines fp.readlines last line lines 1 即使不考慮異常處理的問題,這個 也不完美,因為如果檔案很大,lines...

讀取檔案的最後一行

def get last line for small file fname with open fname,r encoding utf 8 as f 開啟檔案 lines f.readlines 讀取所有行 first line lines 0 取第一行 last line lines 1 取最...