最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C\C++實現(xiàn)讀寫二進制文件的方法詳解

 更新時間:2023年03月30日 11:25:43   作者:iBlackAngel  
這篇文章主要為大家詳細介紹了C\C++實現(xiàn)讀寫二進制文件的方法,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以了解一下

讀寫二進制文件

打開文件

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

#include <stdio.h>

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

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

ModeDescription
r以讀方式打開文件
w以寫方式打開文件,如果文件不存在將創(chuà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ù)據到 ptr 所指向的數(shù)組中。

  • ptr – 指向帶有最小尺寸 size*nmemb 字節(jié)的內存塊的指針。
  • size – 讀取的每個元素的大小,以字節(jié)為單位。
  • nmemb – 元素的個數(shù),每個元素的大小為 size 字節(jié)。
  • stream – 指向 FILE 對象的指針,該 FILE 對象指定了一個輸入流。

當執(zhí)行成功時,fread() 返回讀取到的數(shù)據大小,該大小僅當 size 為 1 時等于傳輸?shù)淖止?jié)數(shù)。如果發(fā)生錯誤,或到達文件結尾時,返回值為短計數(shù)(或零)。

fread() 不區(qū)分文件結尾和錯誤,調用者必須使用 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;
}

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

#include <stdio.h>

int feof(FILE *stream);

函數(shù) feof() 測試指向流的文件結束指示符(end-of-file indicator),如果設置了,則返回非零值。文件指示符只能通過函數(shù) 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;
}

寫入函數(shù)

#include <stdio.h>

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

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

  • ptr – 指向需要寫入到文件中的數(shù)組的指針
  • size – 寫入的每個元素的大小,以字節(jié)為單位
  • nmemb – 元素的個數(shù),每個元素的大小為 size 字節(jié)
  • stream – 指向 FILE 對象的指針,該 FILE 對象指定了一個輸出流。

當執(zhí)行成功時,fwrite() 返回寫入到文件的數(shù)據大小,該大小僅當 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;
}

到此這篇關于C\C++實現(xiàn)讀寫二進制文件的方法詳解的文章就介紹到這了,更多相關C++讀寫二進制文件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++錯誤使用迭代器超出引用范圍問題及解決方案

    C++錯誤使用迭代器超出引用范圍問題及解決方案

    這篇文章主要介紹了C++錯誤使用迭代器超出引用范圍分析與解決,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • java 出現(xiàn)NullPointerException的原因及解決辦法

    java 出現(xiàn)NullPointerException的原因及解決辦法

    這篇文章主要介紹了java 出現(xiàn)NullPointerException的原因及解決辦法的相關資料,這里說明出現(xiàn)NullPointerException 的原因的總結,并說明該如何解決,需要的朋友可以參考下
    2017-08-08
  • 使用C語言實現(xiàn)最小生成樹求解的簡單方法

    使用C語言實現(xiàn)最小生成樹求解的簡單方法

    這篇文章主要介紹了使用C語言實現(xiàn)最小生成樹求解的簡單方法,包括Prim算法和Kruskal算法的兩種求解方式,需要的朋友可以參考下
    2015-08-08
  • C++11中移動構造函數(shù)案例代碼

    C++11中移動構造函數(shù)案例代碼

    C++11 標準中為了滿足用戶使用左值初始化同類對象時也通過移動構造函數(shù)完成的需求,新引入了 std::move() 函數(shù),它可以將左值強制轉換成對應的右值,由此便可以使用移動構造函數(shù),對C++11移動構造函數(shù)相關知識感興趣的朋友一起看看吧
    2023-01-01
  • C++實現(xiàn)冒泡排序的多種方式詳解

    C++實現(xiàn)冒泡排序的多種方式詳解

    冒泡排序是最基礎的排序算法之一,它的核心思想是通過相鄰元素的比較和交換,將較大的元素逐步冒泡到數(shù)組的末尾,今天我們來分析三種不同的冒泡排序實現(xiàn)方式,每種都有其獨特之處,需要的朋友可以參考下
    2025-10-10
  • OpenCV實現(xiàn)圖像背景虛化效果原理詳解

    OpenCV實現(xiàn)圖像背景虛化效果原理詳解

    相信用過相機的同學都知道虛化特效,這是一種使焦點聚集在拍攝主題上,讓背景變得朦朧的效果。本文將詳細介紹一些這一效果的實現(xiàn)原理以及代碼,需要的可以參考一下
    2022-03-03
  • C++實現(xiàn)幸運大抽獎(QT版)

    C++實現(xiàn)幸運大抽獎(QT版)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)幸運大抽獎,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C++實現(xiàn)LeetCode( 69.求平方根)

    C++實現(xiàn)LeetCode( 69.求平方根)

    這篇文章主要介紹了C++實現(xiàn)LeetCode( 69.求平方根),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • c++項目構成從cmake使用基礎詳解

    c++項目構成從cmake使用基礎詳解

    這篇文章主要為大家介紹了c++項目構成,從cmake使用基礎開始為大家講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • C語言指針如何實現(xiàn)字符串逆序反轉

    C語言指針如何實現(xiàn)字符串逆序反轉

    這篇文章主要介紹了C語言指針如何實現(xiàn)字符串逆序反轉,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評論

留坝县| 正宁县| 土默特左旗| 托里县| 吉安市| 那曲县| 东乡| 政和县| 东源县| 西和县| 横山县| 钟山县| 会东县| 疏附县| 偏关县| 卢龙县| 阜城县| 高尔夫| 长海县| 沁水县| 北票市| 二手房| 沛县| 和林格尔县| 岳西县| 濮阳县| 绥滨县| 承德县| 华宁县| 韶山市| 和林格尔县| 伊宁市| 云南省| 砀山县| 安塞县| 会同县| 濉溪县| 荃湾区| 临沭县| 西城区| 翼城县|