欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

讀寫二進(jìn)制文件

打開文件

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

#include <stdio.h>

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

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

ModeDescription
r以讀方式打開文件
w以寫方式打開文件,如果文件不存在將創(chuàng)建一個(gè)新文件,如果文件已經(jīng)存在則截?cái)酁榱汩L度,重新寫入
a以追加方式打開文件(在文件尾部寫入),如果文件不存在將創(chuàng)建一個(gè)新文件
r+以讀寫方式打開文件
w+以讀寫方式打開文件,如果文件不存在將創(chuàng)建一個(gè)新文件,否則截?cái)酁榱汩L度
a+以讀與追加方式打開文件,如果文件不存在將創(chuàng)建一個(gè)新文件,輸出總是添加到文件尾部

訪問模式字符串還可以包含字母 “b” 作為最后一個(gè)字符或上述兩個(gè)字符字符串中任何一個(gè)字符之間的字符。這完全是為了兼容 C89;在所有符合 POSIX 的系統(tǒng)上忽略 “b” 字符,包括 Linux。(其他系統(tǒng)可能會以不同的方式處理文本文件和二進(jìn)制文件,如果您對二進(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 對象的指針,該 FILE 對象指定了一個(gè)輸入流。

當(dāng)執(zhí)行成功時(shí),fread() 返回讀取到的數(shù)據(jù)大小,該大小僅當(dāng) size 為 1 時(shí)等于傳輸?shù)淖止?jié)數(shù)。如果發(fā)生錯誤,或到達(dá)文件結(jié)尾時(shí),返回值為短計(jì)數(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è)置了,則返回非零值。文件指示符只能通過函數(shù) clearerr() 清除。

通俗地理解,就是在二進(jìn)制文件讀取過程中,通過 feof() 判斷是否已經(jīng)到達(dá)文件結(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 – 寫入的每個(gè)元素的大小,以字節(jié)為單位
  • nmemb – 元素的個(gè)數(shù),每個(gè)元素的大小為 size 字節(jié)
  • stream – 指向 FILE 對象的指針,該 FILE 對象指定了一個(gè)輸出流。

當(dāng)執(zhí)行成功時(shí),fwrite() 返回寫入到文件的數(shù)據(jù)大小,該大小僅當(dāng) size 為 1 時(shí)等于傳輸?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++實(shí)現(xiàn)讀寫二進(jìn)制文件的方法詳解的文章就介紹到這了,更多相關(guān)C++讀寫二進(jìn)制文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 最新C語言中g(shù)etchar的使用

    最新C語言中g(shù)etchar的使用

    getchar()是在輸入緩沖區(qū)順序讀入一個(gè)字符(包括空格、回車和Tab) ,getchar()是stdio.h中的庫函數(shù),它的作用是從stdin流中讀入一個(gè)字符,本文給大家介紹getchar的使用,感興趣的朋友跟隨小編一起看看吧
    2022-12-12
  • C++中傳值、傳地址和傳引用究竟有哪些區(qū)別

    C++中傳值、傳地址和傳引用究竟有哪些區(qū)別

    指針是一個(gè)變量,只不過這個(gè)變量存儲的是一個(gè)地址,指向內(nèi)存的一個(gè)存儲單元,而引用跟原來的變量實(shí)質(zhì)上是同一個(gè)東西,只不過是原變量的一個(gè)別名而已,這篇文章主要給大家介紹了關(guān)于C++中傳值、傳地址和傳引用究竟有哪些區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • C++ std::function的用法詳解

    C++ std::function的用法詳解

    這篇文章主要介紹了C++ std::function使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-10-10
  • Qt入門學(xué)習(xí)之?dāng)?shù)據(jù)庫操作指南

    Qt入門學(xué)習(xí)之?dāng)?shù)據(jù)庫操作指南

    Qt SQL模塊為數(shù)據(jù)庫提供了編程支持,Qt支持很多種常見的數(shù)據(jù)庫,如 MySQL Oracle、MS SQL Server、SQLite等,下面這篇文章主要介紹了這篇文章主要給大家介紹了關(guān)于Qt入門學(xué)習(xí)之?dāng)?shù)據(jù)庫操作指南的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • C++?OpenCV中幾種基本的圖像處理方式

    C++?OpenCV中幾種基本的圖像處理方式

    大家好,本篇文章主要講的是C++?OpenCV中幾種基本的圖像處理方式,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C語言刪除輸入字符串中的空格示例代碼

    C語言刪除輸入字符串中的空格示例代碼

    最近工作中遇到了需求,要刪除字符串中的所有空格,就要篩選出空格字符,這篇文章主要給大家介紹了關(guān)于利用C語言刪除輸入字符串中的空格的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • opencv提取輪廓大于某個(gè)閾值的圖像

    opencv提取輪廓大于某個(gè)閾值的圖像

    這篇文章主要為大家詳細(xì)介紹了opencv提取輪廓大于某個(gè)閾值的圖像,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 區(qū)分c++中的聲明與定義

    區(qū)分c++中的聲明與定義

    這篇文章主要介紹了如何區(qū)分c++中的聲明與定義,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • 利用Matlab繪制有趣圖像的示例代碼

    利用Matlab繪制有趣圖像的示例代碼

    這篇文章主要為大家總結(jié)了一些利用Matlab繪制的有趣好看的圖像的示例代碼。文中的示例代碼簡潔易懂,感興趣的小伙伴可以動手試一試
    2022-03-03
  • 最新評論