C\C++實(shí)現(xiàn)讀寫(xiě)二進(jìn)制文件的方法詳解
讀寫(xiě)二進(jìn)制文件
打開(kāi)文件
fopen() 函數(shù)用來(lái)創(chuàng)建一個(gè)新文件或者打開(kāi)一個(gè)已有的文件,該函數(shù)返回一個(gè) FILE 對(duì)象的指針,函數(shù)原型:
#include <stdio.h> FILE *fopen(const char *pathname, const char *mode);
pathname 是指向文件路徑的字符串指針,mode 訪問(wèn)模式包括以下幾種:
| Mode | Description |
|---|---|
| r | 以讀方式打開(kāi)文件 |
| w | 以寫(xiě)方式打開(kāi)文件,如果文件不存在將創(chuàng)建一個(gè)新文件,如果文件已經(jīng)存在則截?cái)酁榱汩L(zhǎng)度,重新寫(xiě)入 |
| a | 以追加方式打開(kāi)文件(在文件尾部寫(xiě)入),如果文件不存在將創(chuàng)建一個(gè)新文件 |
| r+ | 以讀寫(xiě)方式打開(kāi)文件 |
| w+ | 以讀寫(xiě)方式打開(kāi)文件,如果文件不存在將創(chuàng)建一個(gè)新文件,否則截?cái)酁榱汩L(zhǎng)度 |
| a+ | 以讀與追加方式打開(kāi)文件,如果文件不存在將創(chuàng)建一個(gè)新文件,輸出總是添加到文件尾部 |
訪問(wèn)模式字符串還可以包含字母 “b” 作為最后一個(gè)字符或上述兩個(gè)字符字符串中任何一個(gè)字符之間的字符。這完全是為了兼容 C89;在所有符合 POSIX 的系統(tǒng)上忽略 “b” 字符,包括 Linux。(其他系統(tǒng)可能會(huì)以不同的方式處理文本文件和二進(jìn)制文件,如果您對(duì)二進(jìn)制文件進(jìn)行 I/O 操作,并且希望您的程序可以移植到非UNIX環(huán)境,則添加“b”可能是一個(gè)好主意。)
二進(jìn)制 I/O 函數(shù)
讀取函數(shù)
#include <stdio.h> size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
從給定流 stream 讀取數(shù)據(jù)到 ptr 所指向的數(shù)組中。
- ptr – 指向帶有最小尺寸 size*nmemb 字節(jié)的內(nèi)存塊的指針。
- size – 讀取的每個(gè)元素的大小,以字節(jié)為單位。
- nmemb – 元素的個(gè)數(shù),每個(gè)元素的大小為 size 字節(jié)。
- stream – 指向 FILE 對(duì)象的指針,該 FILE 對(duì)象指定了一個(gè)輸入流。
當(dāng)執(zhí)行成功時(shí),fread() 返回讀取到的數(shù)據(jù)大小,該大小僅當(dāng) size 為 1 時(shí)等于傳輸?shù)淖止?jié)數(shù)。如果發(fā)生錯(cuò)誤,或到達(dá)文件結(jié)尾時(shí),返回值為短計(jì)數(shù)(或零)。
fread() 不區(qū)分文件結(jié)尾和錯(cuò)誤,調(diào)用者必須使用 feof() 和 ferror() 來(lái)確定發(fā)生了什么。
示例代碼:
#include <stdio.h>
#include <stdint.h> // included for uint8_t
int main(int argc, char const *argv[]) {
uint8_t buf[4096] = {0x00};
FILE *fp = fopen("/usr/bin/prince", "r");
size_t size = fread(buf, sizeof(uint8_t), sizeof(buf), fp);
fclose(fp);
return 0;
}
檢查文件結(jié)尾 (end-of-file)
#include <stdio.h> int feof(FILE *stream);
函數(shù) feof() 測(cè)試指向流的文件結(jié)束指示符(end-of-file indicator),如果設(shè)置了,則返回非零值。文件指示符只能通過(guò)函數(shù) clearerr() 清除。
通俗地理解,就是在二進(jìn)制文件讀取過(guò)程中,通過(guò) feof() 判斷是否已經(jīng)到達(dá)文件結(jié)尾。所以上面示例的完整版將類(lèi)似這樣:
#include <stdio.h>
#include <stdint.h> // included for uint8_t
static void print_data(const uint8_t *data, size_t len) {
for (size_t i = 0; i < len; ++i) {
if (i != 0 && i % 16 == 0) printf("\n");
printf("%02x ", data[i]);
}
printf("\n");
}
int main(int argc, char const *argv[])
{
uint8_t buf[4096] = {0x00};
size_t size = 0;
FILE *fp = fopen("/usr/bin/xxd", "r");
if (fp == NULL) return 1;
while (!feof(fp)) {
size = fread(buf, sizeof(uint8_t), sizeof(buf), fp);
print_data(buf, size);
// do something...
}
fclose(fp);
return 0;
}
寫(xiě)入函數(shù)
#include <stdio.h> size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
把 ptr 所指向的數(shù)組中的數(shù)據(jù)寫(xiě)入給定的 stream 流中。
- ptr – 指向需要寫(xiě)入到文件中的數(shù)組的指針
- size – 寫(xiě)入的每個(gè)元素的大小,以字節(jié)為單位
- nmemb – 元素的個(gè)數(shù),每個(gè)元素的大小為 size 字節(jié)
- stream – 指向 FILE 對(duì)象的指針,該 FILE 對(duì)象指定了一個(gè)輸出流。
當(dāng)執(zhí)行成功時(shí),fwrite() 返回寫(xiě)入到文件的數(shù)據(jù)大小,該大小僅當(dāng) size 為 1 時(shí)等于傳輸?shù)淖止?jié)數(shù)。如果發(fā)生錯(cuò)誤,返回值與 size*nmemb 不相等。
示例代碼:
#include <stdio.h>
#include <stdint.h> // included for uint8_t
int main(int argc, char const *argv[]) {
uint8_t buf[8] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
FILE *fp = fopen("/tmp/hello.bin", "w");
size_t size = fwrite(buf, sizeof(uint8_t), sizeof(buf), fp);
fclose(fp);
return 0;
}
到此這篇關(guān)于C\C++實(shí)現(xiàn)讀寫(xiě)二進(jìn)制文件的方法詳解的文章就介紹到這了,更多相關(guān)C++讀寫(xiě)二進(jìn)制文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++使用read()和write()讀寫(xiě)二進(jìn)制文件
- C++?二進(jìn)制文件讀寫(xiě)方式及示例詳解
- C++用read()和write()讀寫(xiě)二進(jìn)制文件的超詳細(xì)教程
- C++讀寫(xiě)(CSV,Yaml,二進(jìn)制)文件的方法詳解
- C/C++中二進(jìn)制文件&順序讀寫(xiě)詳解及其作用介紹
- C/C++讀寫(xiě)文本文件、二進(jìn)制文件的方法
- 利用C/C++二進(jìn)制讀寫(xiě)png文件的方法示例
- 詳解C++編程中對(duì)二進(jìn)制文件的讀寫(xiě)操作
- C++實(shí)現(xiàn)文本與二進(jìn)制文件讀寫(xiě)操作的示例
相關(guān)文章
C++錯(cuò)誤使用迭代器超出引用范圍問(wèn)題及解決方案
這篇文章主要介紹了C++錯(cuò)誤使用迭代器超出引用范圍分析與解決,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
java 出現(xiàn)NullPointerException的原因及解決辦法
這篇文章主要介紹了java 出現(xiàn)NullPointerException的原因及解決辦法的相關(guān)資料,這里說(shuō)明出現(xiàn)NullPointerException 的原因的總結(jié),并說(shuō)明該如何解決,需要的朋友可以參考下2017-08-08
使用C語(yǔ)言實(shí)現(xiàn)最小生成樹(shù)求解的簡(jiǎn)單方法
這篇文章主要介紹了使用C語(yǔ)言實(shí)現(xiàn)最小生成樹(shù)求解的簡(jiǎn)單方法,包括Prim算法和Kruskal算法的兩種求解方式,需要的朋友可以參考下2015-08-08
C++11中移動(dòng)構(gòu)造函數(shù)案例代碼
C++11 標(biāo)準(zhǔn)中為了滿(mǎn)足用戶(hù)使用左值初始化同類(lèi)對(duì)象時(shí)也通過(guò)移動(dòng)構(gòu)造函數(shù)完成的需求,新引入了 std::move() 函數(shù),它可以將左值強(qiáng)制轉(zhuǎn)換成對(duì)應(yīng)的右值,由此便可以使用移動(dòng)構(gòu)造函數(shù),對(duì)C++11移動(dòng)構(gòu)造函數(shù)相關(guān)知識(shí)感興趣的朋友一起看看吧2023-01-01
OpenCV實(shí)現(xiàn)圖像背景虛化效果原理詳解
相信用過(guò)相機(jī)的同學(xué)都知道虛化特效,這是一種使焦點(diǎn)聚集在拍攝主題上,讓背景變得朦朧的效果。本文將詳細(xì)介紹一些這一效果的實(shí)現(xiàn)原理以及代碼,需要的可以參考一下2022-03-03
C++實(shí)現(xiàn)幸運(yùn)大抽獎(jiǎng)(QT版)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)幸運(yùn)大抽獎(jiǎng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
C++實(shí)現(xiàn)LeetCode( 69.求平方根)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode( 69.求平方根),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
c++項(xiàng)目構(gòu)成從cmake使用基礎(chǔ)詳解
這篇文章主要為大家介紹了c++項(xiàng)目構(gòu)成,從cmake使用基礎(chǔ)開(kāi)始為大家講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
C語(yǔ)言指針如何實(shí)現(xiàn)字符串逆序反轉(zhuǎn)
這篇文章主要介紹了C語(yǔ)言指針如何實(shí)現(xiàn)字符串逆序反轉(zhuǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07

