網站首頁 編程語言 正文
前言
以前對C語言與C++不夠了解時,我無法知道如何完整獲取一個文件的所有數據并且不遺漏掉。
在網絡上也搜索了很多很多的相關帖子,但是沒有一個是真正有用的。
本文章使用C語言進行演示,如需使用C++的話原理為一樣的。
以下列出那些沒用的代碼
第一種方法
// 創建一個變量,然后使用FILE指針打開一個文件
// 用fgetc函數與循環代碼不斷將數據讀取到變量中
uint8_t data[4096];
FILE *fp = fopen("文件路徑", "rb");
for(int x = 0; x < 4096; ++x) {
data[x] = fgetc(fp);
}
這種方法的弊端是什么呢?
- 在不知道文件大小的情況下盲目直接讀取可能會產生各種意想不到的情況。
- 就算知道文件大小,你難不成要每個文件都先看一眼大???
- 代碼量比較多且不易維護。
第二種方法
// 這個可以說也是我見到最多的方法了
// 但是這個方法真的很蠢,真的很蠢。
uint8_t data[4096];
uint8_t temp;
FILE *fp = fopen("文件路徑", "rb");
int x = 0;
while((temp = fgetc(fp)) != EOF) {
data[x] = temp;
x++;
}
這種方法的好處比第一種要多,但是依舊很蠢。
- 可以通過EOF判斷文件是否被“讀取完畢”
- 不至于讓指針像第一個那樣亂來
壞處也很明顯,此方法使用EOF而不是真正的文件終止符。
那么你在讀取jpg或jpeg格式的圖片文件時,你就會明白為什么這個方法蠢了。
第三種方法
// 這種方法類似于第一種方法
char data[4096];
FILE *fp = fopen("1.txt", "rb");
data = fgets(data, 文件大小, fp);
這個方法可以說是最沒用的,因為它只能讀取ASCII字符
大于0x7f 小于等于 0xff的數據都無法讀取。
解決
// 使用fread函數與fwrite函數對文件進行操作
// 使用feof文件終止符判斷文件是否已經讀取完畢。
// 同時可以使用文件的偏移指針確定文件大小來決定變量該為多大
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位的函數)
- 創建一個指針,指向無符號字符類型,使用的內存大小為文件大小
- 使用fread函數一次性讀取(電腦配置不高的可能會出現假死)
- 讀取完畢之后,文件就被你一次性完全讀取了。
- 請注意你的內存情況以及磁盤空間情況,否則可能會出大問題。
原文鏈接:https://blog.csdn.net/qq_37435462/article/details/126804210
相關推薦
- 2022-09-09 Redis中ZSet的具體使用_Redis
- 2022-04-19 jQuery下實現等待指定元素加載完畢
- 2022-04-06 C/C++的內存管理你了解嘛_C 語言
- 2024-04-07 springboot后端接收前端傳數組參數方法
- 2022-04-10 Blazor頁面組件用法介紹_基礎應用
- 2022-06-12 C語言數據結構中堆排序的分析總結_C 語言
- 2022-08-15 如何實現響應式(自適應)網頁
- 2022-09-10 C++中memcpy函數的使用以及模擬實現_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支