欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C/C++讀取大文件數(shù)據(jù)方式詳細講解

 更新時間:2022年09月14日 08:36:54   作者:SN-Grotesque  
這篇文章主要介紹了C語言/C++讀取大文件數(shù)據(jù)的完整方式過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

以前對C語言與C++不夠了解時,我無法知道如何完整獲取一個文件的所有數(shù)據(jù)并且不遺漏掉。

在網(wǎng)絡(luò)上也搜索了很多很多的相關(guān)帖子,但是沒有一個是真正有用的。

本文章使用C語言進行演示,如需使用C++的話原理為一樣的。

以下列出那些沒用的代碼

第一種方法

// 創(chuàng)建一個變量,然后使用FILE指針打開一個文件
// 用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);
}

這種方法的弊端是什么呢?

  1. 在不知道文件大小的情況下盲目直接讀取可能會產(chǎn)生各種意想不到的情況。
  2. 就算知道文件大小,你難不成要每個文件都先看一眼大小?
  3. 代碼量比較多且不易維護。

第二種方法

// 這個可以說也是我見到最多的方法了
// 但是這個方法真的很蠢,真的很蠢。
uint8_t data[4096];
uint8_t temp;
FILE *fp = fopen("文件路徑", "rb");
int x = 0;
while((temp = fgetc(fp)) != EOF) {
	data[x] = temp;
	x++;
}

這種方法的好處比第一種要多,但是依舊很蠢。

  1. 可以通過EOF判斷文件是否被“讀取完畢”
  2. 不至于讓指針像第一個那樣亂來

壞處也很明顯,此方法使用EOF而不是真正的文件終止符。

那么你在讀取jpg或jpeg格式的圖片文件時,你就會明白為什么這個方法蠢了。

第三種方法

// 這種方法類似于第一種方法
char data[4096];
FILE *fp = fopen("1.txt", "rb");
data = fgets(data, 文件大小, fp);

這個方法可以說是最沒用的,因為它只能讀取ASCII字符

大于0x7f 小于等于 0xff的數(shù)據(jù)都無法讀取。

解決

// 使用fread函數(shù)與fwrite函數(shù)對文件進行操作
// 使用feof文件終止符判斷文件是否已經(jīng)讀取完畢。
// 同時可以使用文件的偏移指針確定文件大小來決定變量該為多大
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);
}

這樣便可以絕對確保文件被完整讀取。

當然你可能會說這也沒有把文件直接一次性讀完啊?

那接下來我說的你就聽好。

  • 先通過文件指針來獲取文件的大小(Windows端請使用64位的函數(shù))
  • 創(chuàng)建一個指針,指向無符號字符類型,使用的內(nèi)存大小為文件大小
  • 使用fread函數(shù)一次性讀取(電腦配置不高的可能會出現(xiàn)假死)
  • 讀取完畢之后,文件就被你一次性完全讀取了。
  • 請注意你的內(nèi)存情況以及磁盤空間情況,否則可能會出大問題。

到此這篇關(guān)于C/C++讀取大文件數(shù)據(jù)方式詳細講解的文章就介紹到這了,更多相關(guān)C++讀取大文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++深入探究繼承的概念與使用

    C++深入探究繼承的概念與使用

    繼承是C++面向?qū)ο缶幊讨械囊婚T。繼承是子類繼承父類的特征和行為,或者是繼承父類得方法,使的子類具有父類得的特性和行為。重寫是子類對父類的允許訪問的方法實行的過程進行重新編寫,返回值和形參都不能改變。就是對原本的父類進行重新編寫,但是外部接口不能被重寫
    2022-05-05
  • Qt基礎(chǔ)開發(fā)之Qt多線程類QThread與Qt定時器類QTimer的詳細方法與實例

    Qt基礎(chǔ)開發(fā)之Qt多線程類QThread與Qt定時器類QTimer的詳細方法與實例

    這篇文章主要介紹了Qt基礎(chǔ)開發(fā)之Qt多線程類QThread與Qt定時器類QTimer的詳細方法與實例,需要的朋友可以參考下
    2020-03-03
  • C++?MiniZip實現(xiàn)目錄壓縮與解壓的示例詳解

    C++?MiniZip實現(xiàn)目錄壓縮與解壓的示例詳解

    Zlib是一個開源的數(shù)據(jù)壓縮庫,提供了一種通用的數(shù)據(jù)壓縮和解壓縮算法,本文主要為大家詳細介紹了如何利用Zlib實現(xiàn)目錄壓縮與解壓,需要的小伙伴可以參考下
    2023-11-11
  • C++標準模板庫函數(shù)sort的那些事兒

    C++標準模板庫函數(shù)sort的那些事兒

    sort函數(shù)是標準模板庫的函數(shù),已知開始和結(jié)束的地址即可進行排序,可以用于比較任何容器(必須滿足隨機迭代器),任何元素,任何條件,執(zhí)行速度一般比qsort要快
    2013-09-09
  • 詳解C語言中結(jié)構(gòu)體的使用

    詳解C語言中結(jié)構(gòu)體的使用

    結(jié)構(gòu)體是一些值的集合,這些值稱為成員變量,結(jié)構(gòu)體的每個成員可以是不同類型的變量。本文將通過示例為大家詳細講講C語言中結(jié)構(gòu)體的使用,需要的可以參考一下
    2022-07-07
  • C++ primer超詳細講解順序容器

    C++ primer超詳細講解順序容器

    本文主要介紹了C++順序容器(vector、deque、list)的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • C++實現(xiàn)算法兩個數(shù)字相加詳解

    C++實現(xiàn)算法兩個數(shù)字相加詳解

    這篇文章主要介紹了C++實現(xiàn)算法兩個數(shù)字相加詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 一文搞懂C++多態(tài)的用法

    一文搞懂C++多態(tài)的用法

    C++多態(tài)是在繼承的基礎(chǔ)上實現(xiàn)的,了解多態(tài)之前我們需要掌握一定的C++繼承的知識,本文將介紹C++中多態(tài)的概念,構(gòu)成條件以及用法,感興趣的可以學習一下
    2022-04-04
  • C++野指針的具體實現(xiàn)

    C++野指針的具體實現(xiàn)

    野指針就是指針指向的不是一個有效(合法)的地址,本文主要介紹了C++野指針的具體實現(xiàn),文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2024-03-03
  • C++11各種鎖的具體使用

    C++11各種鎖的具體使用

    本文主要介紹了C++11各種鎖的具體使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評論