簡體   English   中英

C : 從二進制文件中讀取字節

[英]C : Reading bytes from binary file

我目前正在嘗試從二進制文件中讀取 256 個字節,並且在運行我的程序時沒有得到任何輸出(或錯誤)。 我有點困惑我哪里出錯了。 嘗試將每個byte讀取為char並存儲為長度為 256 的字符數組。我已經查看了關於 SO 的類似問題,到目前為止還沒有任何運氣。 我的代碼的簡化版本如下:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
    FILE *binary = fopen(argv[1], "rb");
    char bytesFromBinary[256];

    fread(&bytesFromBinary, 1, 256, binary);
    printf("%s", bytesFromBinary);
    return 0;
}

fread的基本用法將根據預期的字節數檢查返回值,以驗證您閱讀了您打算閱讀的內容。 保存返回也允許您處理部分讀取。

下面的最小示例一次從作為第一個參數給出的文件(如果沒有給出文件,則默認為stdin讀取 16 個字節到buf ,然后將每個值以十六進制格式輸出到stdout

#include <stdio.h>

#define BUFSZ 16

int main (int argc, char **argv) {

    unsigned char buf[BUFSZ] = {0};
    size_t bytes = 0, i, readsz = sizeof buf;
    FILE *fp = argc > 1 ? fopen (argv[1], "rb") : stdin;

    if (!fp) {
        fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
        return 1;
    }

    /* read/output BUFSZ bytes at a time */
    while ((bytes = fread (buf, sizeof *buf, readsz, fp)) == readsz) {
        for (i = 0; i < readsz; i++)
            printf (" 0x%02x", buf[i]);
        putchar ('\n');
    }
    for (i = 0; i < bytes; i++) /* output final partial buf */
        printf (" 0x%02x", buf[i]);
    putchar ('\n');

    if (fp != stdin)
        fclose (fp);

    return 0;
}

(注意: bytes == readsz僅當freadsize參數為1 。返回的是讀取的items數,對於char類型值,每個項目僅等於1

示例使用/輸出

$ echo "A quick brown fox jumps over the lazy dog" | ./bin/fread_write_hex
 0x41 0x20 0x71 0x75 0x69 0x63 0x6b 0x20 0x62 0x72 0x6f 0x77 0x6e 0x20 0x66 0x6f
 0x78 0x20 0x6a 0x75 0x6d 0x70 0x73 0x20 0x6f 0x76 0x65 0x72 0x20 0x74 0x68 0x65
 0x20 0x6c 0x61 0x7a 0x79 0x20 0x64 0x6f 0x67 0x0a

查看示例,如果您有任何問題,請告訴我。

您還沒有聲明足夠長的變量。

您的聲明char bytesFromBinary[256]; 保留 256 個字節, fread填充所有 256 個字節。 沒有尾隨'\\0'並且它沒有空間,因此內存中接下來發生的任何事情都會被覆蓋/破壞。 這已經會導致各種隨機錯誤和崩潰。

然后,在 printf 中,您嘗試打印它,該函數將繼續在內存中運行,直到碰巧遇到'\\0'來停止它,因此如果程序到達那里,您將得到內存的打印輸出,也許短,可能有數千個(不可打印)字符長。

您需要始終將變量聲明為一個更長的時間,以便為尾隨的'\\0' char bytesFromBinary[257];空間: char bytesFromBinary[257]; . 更好的是在 fread 中使用sizeof(var)-1 ,或者使用一個常量來獲得所需的長度並用 +1 聲明它。

它失敗是因為您嘗試將字節塊打印為 C 樣式字符串。

有兩種文件:二進制文件和文本文件。 要讀/寫文件,您應該以相應的模式打開它。

如果您的文件是以這種方式創建的:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    FILE *binary = fopen("file.txt", "wbx");
    if(!binary)
    {
        perror("fopen()");
        exit(EXIT_FAILURE);
    }
    char bytesToBinary[256] = ":-)";

    fwrite(bytesToBinary, 1, 256, binary);
    fclose(binary);
    return 0;
}

你的代碼應該是成功的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM