c 處理大檔案

2021-06-17 19:26:19 字數 864 閱讀 1660

最近寫乙個小工程,要讀寫大檔案,10~20g。

開始經過一番考慮,考慮到c函式的高效與操作難度(以前用c的函式,總忘關檔案)。直接使用了c++的ifstream,用類操作比較方便。由於隨機讀取檔案位置,所以需要找辦法能讀取到任一位置,這在處理小檔案時沒有問題,但在處理大於4g檔案時出現了問題。

以前在linux下,沒多考慮什麼,c和c++處理大於4g檔案都沒有問題,現在才知道原來是64位linux系統,預設編64位程式了,所有的操作都在編譯時因為特殊的巨集而具有了處理大於4g檔案的能力。

這回在windows下編譯的32位程式,程式中封裝ifstream做了乙個隨機讀取類,結果發現大約到3.4g的時候,總也讀不過去了。查了一下,發現c++ 標準庫中ifstream中的streamoff預設編譯的32,於是ifstream::fseek(streampos pos)是無效,然後考慮使用,ifstream::seekg (streamoff off, ios_base::seekdir way),結果發現這個ios_base::seekdir也是只能處理32位的檔案長度。

無奈之下,google一次,獲得msdn的函式 _fseeki64 , _ftelli64,完美解決問題。

msdn** , 

然後為了配合c函式,我找了相應c函式來檢視檔案狀態。 

feof(file* fp)檢視檔案是否到結尾,到結尾返回true

ferror(file* fp)查檔案是否狀態異常,檔案正常返回0

clearerr(file*fp)清空檔案各種錯誤標誌位。包括檔案結尾標誌和檔案讀取越界等錯誤。

size_t fread ( void * ptr, size_t size, size_t count, file * stream ); 讀取檔案內容,這個函式非常高效。

Python 大檔案處理

非記憶體資源可以使用with 在python中逐行讀取大檔案 在我們日常工作中,難免會有處理日誌檔案的時候,當檔案小的時候,基本不用當心什麼,直接用file.read 或readlines 就可以了,但是如果是將乙個10g大小的日誌檔案讀取,即檔案大於記憶體的大小,這麼處理就有問題了,會將整個檔案載...

Python 大檔案處理

非記憶體資源可以使用with 在我們日常工作中,難免會有處理日誌檔案的時候,當檔案小的時候,基本不用當心什麼,直接用file.read 或readlines 就可以了,但是如果是將乙個10g大小的日誌檔案讀取,即檔案大於記憶體的大小,這麼處理就有問題了,會將整個檔案載入到記憶體中從而造成memory...

C 中使用記憶體對映檔案處理大檔案

引言 檔案操作是應用程式最為基本的功能之一,win32 api和mfc均提供有支援檔案處理的函式和類,常用的有win32 api的createfile writefile readfile 和mfc提供的cfile類等。一般來說,以上這些函式可以滿足大多數 場合的要求,但是對於某些特殊應用領域所需要...