C:从二进制文件

时间:2016-04-04 01:12:51

标签: c binary fopen fread

我目前正在尝试从二进制文件读取256个字节,并且在运行程序时没有得到任何输出(或错误)。我在这方面出错了,我有点困惑。试图将每个byte读作char并存储为长度为256的字符数组。我已经审查了类似的问题,并且到目前为止还没有运气。我的代码的简化版本如下:

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

3 个答案:

答案 0 :(得分:2)

fread的基本用法将根据预期验证您读取您要读取的内容的字节数来检查返回值。保存返回也允许您处理部分读取。

以下最小示例一次从作为第一个参数的文件(或默认为stdin,如果没有给出文件)一次读取16个字节到buf,然后将每个值输出到{ {1}}以十六进制格式。

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参数sizefread时。返回的是1读取的数量且每个项目仅为items等于1类型值的char

示例使用/输出

$ 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

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

答案 1 :(得分:0)

您尚未声明足够长的变量。

您的声明char bytesFromBinary[256];保留256个字节,fread填充所有256个字节。没有尾随'\0'且没有空间,所以无论在内存中接下来发生什么都会被覆盖/破坏。这已经导致各种随机错误和崩溃。

然后,在printf中,你尝试打印它,并且该函数将继续在内存中运行,直到碰巧遇到'\0'来阻止它,所以如果程序在那里,你会得到一个打印输出记忆,也许是短暂的,可能是数以千计(不可打印)的字符。

您需要将变量声明的时间更长,以便为尾随'\0'char bytesFromBinary[257];留出空间。更好的是在fread中使用sizeof(var)-1,或者使用常量来获得所需的长度并用+1声明它。

答案 2 :(得分:-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;
}

您的代码应该会成功。