C/C++讀取大文件數(shù)據(jù)方式詳細(xì)講解
前言
以前對C語言與C++不夠了解時(shí),我無法知道如何完整獲取一個(gè)文件的所有數(shù)據(jù)并且不遺漏掉。
在網(wǎng)絡(luò)上也搜索了很多很多的相關(guān)帖子,但是沒有一個(gè)是真正有用的。
本文章使用C語言進(jìn)行演示,如需使用C++的話原理為一樣的。
以下列出那些沒用的代碼
第一種方法
// 創(chuàng)建一個(gè)變量,然后使用FILE指針打開一個(gè)文件
// 用fgetc函數(shù)與循環(huán)代碼不斷將數(shù)據(jù)讀取到變量中
uint8_t data[4096];
FILE *fp = fopen("文件路徑", "rb");
for(int x = 0; x < 4096; ++x) {
data[x] = fgetc(fp);
}
這種方法的弊端是什么呢?
- 在不知道文件大小的情況下盲目直接讀取可能會(huì)產(chǎn)生各種意想不到的情況。
- 就算知道文件大小,你難不成要每個(gè)文件都先看一眼大???
- 代碼量比較多且不易維護(hù)。
第二種方法
// 這個(gè)可以說也是我見到最多的方法了
// 但是這個(gè)方法真的很蠢,真的很蠢。
uint8_t data[4096];
uint8_t temp;
FILE *fp = fopen("文件路徑", "rb");
int x = 0;
while((temp = fgetc(fp)) != EOF) {
data[x] = temp;
x++;
}這種方法的好處比第一種要多,但是依舊很蠢。
- 可以通過EOF判斷文件是否被“讀取完畢”
- 不至于讓指針像第一個(gè)那樣亂來
壞處也很明顯,此方法使用EOF而不是真正的文件終止符。
那么你在讀取jpg或jpeg格式的圖片文件時(shí),你就會(huì)明白為什么這個(gè)方法蠢了。
第三種方法
// 這種方法類似于第一種方法
char data[4096];
FILE *fp = fopen("1.txt", "rb");
data = fgets(data, 文件大小, fp);
這個(gè)方法可以說是最沒用的,因?yàn)樗荒茏x取ASCII字符
大于0x7f 小于等于 0xff的數(shù)據(jù)都無法讀取。
解決
// 使用fread函數(shù)與fwrite函數(shù)對文件進(jìn)行操作
// 使用feof文件終止符判斷文件是否已經(jīng)讀取完畢。
// 同時(shí)可以使用文件的偏移指針確定文件大小來決定變量該為多大
FILE *fp = fopen("image_1.jpg", "rb");
uint8_t *data = (uint8_t *)malloc(4096);
size_t fileSize;
while(!feof(fp)) {
fileSize = fread(data, 1, 4096, fp);
}
這樣便可以絕對確保文件被完整讀取。
當(dāng)然你可能會(huì)說這也沒有把文件直接一次性讀完???
那接下來我說的你就聽好。
- 先通過文件指針來獲取文件的大小(Windows端請使用64位的函數(shù))
- 創(chuàng)建一個(gè)指針,指向無符號(hào)字符類型,使用的內(nèi)存大小為文件大小
- 使用fread函數(shù)一次性讀取(電腦配置不高的可能會(huì)出現(xiàn)假死)
- 讀取完畢之后,文件就被你一次性完全讀取了。
- 請注意你的內(nèi)存情況以及磁盤空間情況,否則可能會(huì)出大問題。
到此這篇關(guān)于C/C++讀取大文件數(shù)據(jù)方式詳細(xì)講解的文章就介紹到這了,更多相關(guān)C++讀取大文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言中#define定義的標(biāo)識(shí)符和宏實(shí)例代碼
C語言中,可以用#define定義一個(gè)標(biāo)識(shí)符來表示一個(gè)常量,下面這篇文章主要給大家介紹了關(guān)于C語言中#define定義的標(biāo)識(shí)符和宏的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03
vscode工程中c_cpp_properties.json文件作用詳細(xì)說明
c_cpp_properties.json是Visual Studio Code的一個(gè)配置文件,用于定義C/C++編譯器的路徑、默認(rèn)包含路徑和預(yù)處理器定義,這篇文章主要給大家介紹了關(guān)于vscode工程中c_cpp_properties.json文件作用詳細(xì)說明的相關(guān)資料,需要的朋友可以參考下2024-08-08
C++實(shí)現(xiàn)strcmp字符串比較的深入探討
本篇文章是對使用C++實(shí)現(xiàn)strcmp字符串比較進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
Qt MQTT開發(fā)環(huán)境搭建的實(shí)現(xiàn)示例
本文主要介紹了Qt MQTT開發(fā)環(huán)境搭建的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06

