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

你没有声明足够长的变量。

您的声明 char bytesFromBinary[256]; 保留 256 个字节,fread 填充所有 256 个字节。没有尾随的 '[=12=]',也没有 space,所以无论内存中的下一个发生什么,都会得到 overwritten/destroyed。这已经会导致各种随机错误和崩溃。

然后,在 printf 中,你尝试打印它,函数将通过内存保持 运行 直到它碰巧遇到一个 '[=12=]' 来停止它,所以如果程序让它在那里, 你会得到一份内存打印输出,可能很短,可能有数千个(不可打印的)字符长。

您需要始终将变量声明为更长的时间,以使尾随 '[=12=]' 具有 space:char bytesFromBinary[257];。更好的方法是在 fread 中使用 sizeof(var)-1,或者使用所需长度的常量并用 +1.

声明它

它失败了,因为您正在尝试将字节块打印为 C 风格的字符串。

有两种文件:二进制文件和文本文件。要read/write一个文件,你应该在相应的模式下打开它。

如果您的文件是这样创建的:

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

您的代码应该是成功的。

fread 的基本用法将根据预期的字节数检查 return,以验证您是否阅读了您想要阅读的内容。保存 return 也允许您处理部分读取。

下面的最小示例一次从作为第一个参数给定的文件(如果没有给定文件,则默认为 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时。return为items的个数读取并且每个项目仅等于 1 对于 char 类型值)

例子Use/Output

$ 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

查看示例,如果您有任何问题,请告诉我。