C C 一次將整個檔案讀入記憶體

2021-09-28 17:22:53 字數 1731 閱讀 8018

@1.問題描述:

c和c++的初學者經常採用一行一行讀入檔案的辦法對檔案資料進行處理。但是經常會有一些情況需要將乙個檔案整體一次讀入記憶體處理。而c和c++庫中並沒有提供直接一次讀入檔案全部資料的函式。

@2.解決方法:

目前給出c和c++的解決方案,下面兩個程式只是用於演示,不過這些**已經很容易改寫成想要的函式了。

解決這個問題的思路是:

1.由於要將檔案完整讀入,所以必須使用二進位制方式開啟(若文字方式開啟,檔案流中會把一些非字元的資料過濾掉,我們將讀取不到那些內容)。

2.開啟檔案後,我們首先獲取檔案的大小,然後在記憶體中分配足夠的空間,再把檔案拷貝到記憶體空間中。之後使用記憶體空間進行資料處理,演示程式中沒有真正的處理,我們只是簡單將其輸出。

@3.**:

c實現

#include #include int main ()

/* 獲取檔案大小 */

fseek (pfile , 0 , seek_end);

lsize = ftell (pfile);

rewind (pfile);

/* 分配記憶體儲存整個檔案 */ 

buffer = (char*) malloc (sizeof(char)*lsize);

if (buffer == null)

/* 將檔案拷貝到buffer中 */

result = fread (buffer,1,lsize,pfile);

if (result != lsize)

/* 現在整個檔案已經在buffer中,可由標準輸出列印內容 */

printf("%s", buffer); 

/* 結束演示,關閉檔案並釋放記憶體 */

fclose (pfile);

free (buffer);

return 0;

}

c++實現

#include #include using namespace std;

int main ()

@4.注意的問題:

在這個演示程式中,如果採用文字方式開啟會如何呢?即把c實現中的檔案開啟改為pfile = fopen ("test.txt","r" ),c++中的檔案開啟改為filestr.open ("test.txt")

test.txt

abcdefghijklm

abcdefghijklm

ppdsbd

但是如果採用文字模式開啟仍會出現問題,測試中的「c實現」**的程式會輸出:

abcdefghijklm

abcdefghijklm

ppdsbdes\m

原因是有一些字元被檔案流處理掉了,這造成fread函式講到的字元數少於檔案大小lsize,返回值result不等於lsize於是程式輸出reading error後退出了。

同樣的情況在c++實現的**中也有,但是c++程式並沒有退出,但它的輸出結果不對,內容如下(僅為本機測試結果,因時因機器而異)

abcdefghijklm

abcdefghijklm

ppdsbdes\m

很明顯末尾多出了"es\m"四個無效字元,很明顯檔案的末尾的字串終止符('\0')被處理掉了,它並沒有被寫入buffer中,以致輸出時多輸出了四個無效字元。

————————————————

一次讀入整個二進位制檔案

1.開啟檔案 if fp fopen file name,rb null 2.得到檔案的長度 fseek ap fp,0l,seek end file size ftell fp if 1l file size 3.建立等大小的緩衝 char buffer char malloc file size...

一次讀入整個二進位制檔案

1.開啟檔案 if fp fopen file name,rb null 2.得到檔案的長度 fseek ap fp,0l,seek end file size ftell fp if 1l file size 3.建立等大小的緩衝 char buffer char malloc file size...

c 中ifstream一次讀取整個檔案

c 中一次讀取整個檔案的內容的方法 讀取至char 的情況 讀取至std string的情況 第一種方法 include include include std ifstream t file.txt std string str std istreambuf iterator t std istr...