網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
前言
以前對(duì)C語(yǔ)言與C++不夠了解時(shí),我無(wú)法知道如何完整獲取一個(gè)文件的所有數(shù)據(jù)并且不遺漏掉。
在網(wǎng)絡(luò)上也搜索了很多很多的相關(guān)帖子,但是沒(méi)有一個(gè)是真正有用的。
本文章使用C語(yǔ)言進(jìn)行演示,如需使用C++的話原理為一樣的。
以下列出那些沒(méi)用的代碼
第一種方法
// 創(chuàng)建一個(gè)變量,然后使用FILE指針打開(kāi)一個(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è)可以說(shuō)也是我見(jiàn)到最多的方法了
// 但是這個(gè)方法真的很蠢,真的很蠢。
uint8_t data[4096];
uint8_t temp;
FILE *fp = fopen("文件路徑", "rb");
int x = 0;
while((temp = fgetc(fp)) != EOF) {
data[x] = temp;
x++;
}
這種方法的好處比第一種要多,但是依舊很蠢。
- 可以通過(guò)EOF判斷文件是否被“讀取完畢”
- 不至于讓指針像第一個(gè)那樣亂來(lái)
壞處也很明顯,此方法使用EOF而不是真正的文件終止符。
那么你在讀取jpg或jpeg格式的圖片文件時(shí),你就會(huì)明白為什么這個(gè)方法蠢了。
第三種方法
// 這種方法類(lèi)似于第一種方法
char data[4096];
FILE *fp = fopen("1.txt", "rb");
data = fgets(data, 文件大小, fp);
這個(gè)方法可以說(shuō)是最沒(méi)用的,因?yàn)樗荒茏x取ASCII字符
大于0x7f 小于等于 0xff的數(shù)據(jù)都無(wú)法讀取。
解決
// 使用fread函數(shù)與fwrite函數(shù)對(duì)文件進(jìn)行操作
// 使用feof文件終止符判斷文件是否已經(jīng)讀取完畢。
// 同時(shí)可以使用文件的偏移指針確定文件大小來(lái)決定變量該為多大
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);
}
這樣便可以絕對(duì)確保文件被完整讀取。
當(dāng)然你可能會(huì)說(shuō)這也沒(méi)有把文件直接一次性讀完啊?
那接下來(lái)我說(shuō)的你就聽(tīng)好。
- 先通過(guò)文件指針來(lái)獲取文件的大小(Windows端請(qǐng)使用64位的函數(shù))
- 創(chuàng)建一個(gè)指針,指向無(wú)符號(hào)字符類(lèi)型,使用的內(nèi)存大小為文件大小
- 使用fread函數(shù)一次性讀取(電腦配置不高的可能會(huì)出現(xiàn)假死)
- 讀取完畢之后,文件就被你一次性完全讀取了。
- 請(qǐng)注意你的內(nèi)存情況以及磁盤(pán)空間情況,否則可能會(huì)出大問(wèn)題。
原文鏈接:https://blog.csdn.net/qq_37435462/article/details/126804210
相關(guān)推薦
- 2021-12-02 Spring?Boot?分層打包?Docker?鏡像實(shí)踐及分析(推薦)_docker
- 2022-03-14 surface屏幕自動(dòng)調(diào)節(jié)亮度無(wú)法關(guān)閉
- 2022-05-27 一起來(lái)看看python的裝飾器代碼_python
- 2022-11-08 云原生系列Kubernetes深度解析YAML文件使用_云其它
- 2022-07-06 C++數(shù)據(jù)結(jié)構(gòu)深入探究棧與隊(duì)列_C 語(yǔ)言
- 2023-06-16 Golang調(diào)用FFmpeg轉(zhuǎn)換視頻流的實(shí)現(xiàn)_Golang
- 2022-09-24 C++實(shí)現(xiàn)并優(yōu)化異常系統(tǒng)_C 語(yǔ)言
- 2022-03-30 Flutter有狀態(tài)組件使用詳解_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支