C\C++實現(xiàn)讀寫二進制文件的方法詳解
讀寫二進制文件
打開文件
fopen() 函數(shù)用來創(chuàng)建一個新文件或者打開一個已有的文件,該函數(shù)返回一個 FILE 對象的指針,函數(shù)原型:
#include <stdio.h> FILE *fopen(const char *pathname, const char *mode);
pathname 是指向文件路徑的字符串指針,mode 訪問模式包括以下幾種:
| Mode | Description |
|---|---|
| r | 以讀方式打開文件 |
| w | 以寫方式打開文件,如果文件不存在將創(chuàng)建一個新文件,如果文件已經(jīng)存在則截斷為零長度,重新寫入 |
| a | 以追加方式打開文件(在文件尾部寫入),如果文件不存在將創(chuàng)建一個新文件 |
| r+ | 以讀寫方式打開文件 |
| w+ | 以讀寫方式打開文件,如果文件不存在將創(chuàng)建一個新文件,否則截斷為零長度 |
| a+ | 以讀與追加方式打開文件,如果文件不存在將創(chuàng)建一個新文件,輸出總是添加到文件尾部 |
訪問模式字符串還可以包含字母 “b” 作為最后一個字符或上述兩個字符字符串中任何一個字符之間的字符。這完全是為了兼容 C89;在所有符合 POSIX 的系統(tǒng)上忽略 “b” 字符,包括 Linux。(其他系統(tǒng)可能會以不同的方式處理文本文件和二進制文件,如果您對二進制文件進行 I/O 操作,并且希望您的程序可以移植到非UNIX環(huán)境,則添加“b”可能是一個好主意。)
二進制 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 – 讀取的每個元素的大小,以字節(jié)為單位。
- nmemb – 元素的個數(shù),每個元素的大小為 size 字節(jié)。
- stream – 指向 FILE 對象的指針,該 FILE 對象指定了一個輸入流。
當執(zhí)行成功時,fread() 返回讀取到的數(shù)據(jù)大小,該大小僅當 size 為 1 時等于傳輸?shù)淖止?jié)數(shù)。如果發(fā)生錯誤,或到達文件結(jié)尾時,返回值為短計數(shù)(或零)。
fread() 不區(qū)分文件結(jié)尾和錯誤,調(diào)用者必須使用 feof() 和 ferror() 來確定發(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() 測試指向流的文件結(jié)束指示符(end-of-file indicator),如果設置了,則返回非零值。文件指示符只能通過函數(shù) clearerr() 清除。
通俗地理解,就是在二進制文件讀取過程中,通過 feof() 判斷是否已經(jīng)到達文件結(jié)尾。所以上面示例的完整版將類似這樣:
#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;
}
寫入函數(shù)
#include <stdio.h> size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
把 ptr 所指向的數(shù)組中的數(shù)據(jù)寫入給定的 stream 流中。
- ptr – 指向需要寫入到文件中的數(shù)組的指針
- size – 寫入的每個元素的大小,以字節(jié)為單位
- nmemb – 元素的個數(shù),每個元素的大小為 size 字節(jié)
- stream – 指向 FILE 對象的指針,該 FILE 對象指定了一個輸出流。
當執(zhí)行成功時,fwrite() 返回寫入到文件的數(shù)據(jù)大小,該大小僅當 size 為 1 時等于傳輸?shù)淖止?jié)數(shù)。如果發(fā)生錯誤,返回值與 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++實現(xiàn)讀寫二進制文件的方法詳解的文章就介紹到這了,更多相關(guān)C++讀寫二進制文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

