中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C\C++如何實現讀寫二進制文件

發布時間:2023-03-30 13:56:55 來源:億速云 閱讀:145 作者:iii 欄目:開發技術

這篇文章主要介紹“C\C++如何實現讀寫二進制文件”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“C\C++如何實現讀寫二進制文件”文章能幫助大家解決問題。

讀寫二進制文件

打開文件

fopen() 函數用來創建一個新文件或者打開一個已有的文件,該函數返回一個 FILE 對象的指針,函數原型:

#include <stdio.h>

FILE *fopen(const char *pathname, const char *mode);

pathname 是指向文件路徑的字符串指針,mode 訪問模式包括以下幾種:

ModeDescription
r以讀方式打開文件
w以寫方式打開文件,如果文件不存在將創建一個新文件,如果文件已經存在則截斷為零長度,重新寫入
a以追加方式打開文件(在文件尾部寫入),如果文件不存在將創建一個新文件
r+以讀寫方式打開文件
w+以讀寫方式打開文件,如果文件不存在將創建一個新文件,否則截斷為零長度
a+以讀與追加方式打開文件,如果文件不存在將創建一個新文件,輸出總是添加到文件尾部

訪問模式字符串還可以包含字母 “b” 作為最后一個字符或上述兩個字符字符串中任何一個字符之間的字符。這完全是為了兼容 C89;在所有符合 POSIX 的系統上忽略 “b” 字符,包括 Linux。(其他系統可能會以不同的方式處理文本文件和二進制文件,如果您對二進制文件進行 I/O 操作,并且希望您的程序可以移植到非UNIX環境,則添加“b”可能是一個好主意。)

二進制 I/O 函數

讀取函數

#include <stdio.h>

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

從給定流 stream 讀取數據到 ptr 所指向的數組中。

  • ptr &ndash; 指向帶有最小尺寸 size*nmemb 字節的內存塊的指針。

  • size &ndash; 讀取的每個元素的大小,以字節為單位。

  • nmemb &ndash; 元素的個數,每個元素的大小為 size 字節。

  • stream &ndash; 指向 FILE 對象的指針,該 FILE 對象指定了一個輸入流。

當執行成功時,fread() 返回讀取到的數據大小,該大小僅當 size 為 1 時等于傳輸的字節數。如果發生錯誤,或到達文件結尾時,返回值為短計數(或零)。

fread() 不區分文件結尾和錯誤,調用者必須使用 feof() 和 ferror() 來確定發生了什么。

示例代碼:

#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;
}

檢查文件結尾 (end-of-file)

#include <stdio.h>

int feof(FILE *stream);

函數 feof() 測試指向流的文件結束指示符(end-of-file indicator),如果設置了,則返回非零值。文件指示符只能通過函數 clearerr() 清除。

通俗地理解,就是在二進制文件讀取過程中,通過 feof() 判斷是否已經到達文件結尾。所以上面示例的完整版將類似這樣:

#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;
}

寫入函數

#include <stdio.h>

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

把 ptr 所指向的數組中的數據寫入給定的 stream 流中。

  • ptr &ndash; 指向需要寫入到文件中的數組的指針

  • size &ndash; 寫入的每個元素的大小,以字節為單位

  • nmemb &ndash; 元素的個數,每個元素的大小為 size 字節

  • stream &ndash; 指向 FILE 對象的指針,該 FILE 對象指定了一個輸出流。

當執行成功時,fwrite() 返回寫入到文件的數據大小,該大小僅當 size 為 1 時等于傳輸的字節數。如果發生錯誤,返回值與 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;
}

關于“C\C++如何實現讀寫二進制文件”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++ c
AI

常熟市| 勐海县| 临安市| 海宁市| 盘锦市| 德钦县| 罗田县| 三江| 读书| 兖州市| 郑州市| 澄城县| 仙居县| 兴仁县| 社会| 太谷县| 永丰县| 灵宝市| 米易县| 塘沽区| 东乌珠穆沁旗| 遵义市| 曲水县| 师宗县| 宜州市| 竹溪县| 饶阳县| 外汇| 旬邑县| 丹巴县| 谢通门县| 东明县| 固阳县| 武安市| 红安县| 明水县| 肃北| 当涂县| 镶黄旗| 新化县| 会理县|