2016-04-04 89 views
2

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

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

您正在尝试读取* binary *,然后使用* string *格式说明符进行打印。如果该二进制数据以空字节开始或字节都是不可打印的值,您会期望什么输出?或者,如果这些字节*不包含空终止符来告诉'printf'它停在哪里,会发生什么? –

+1

遍历数组并将每个数组值打印为数字应该可以帮助您查看数组中的内容,因为它不会解释扩展或限制的ASCII字符,而是将其解释为整数值。 – callyalater

+0

该文件的实际内容是什么?你能发布一个片段吗? –

回答

2

fread的基本用法将检查返回与期望验证您读取您想要读取的内容的字节数的关系。保存返回值还可以处理部分读取操作。

以下最小示例在从给定的作为第一个参数(或stdin如果没有给出文件默认情况下)的文件中的时间到buf读取16个字节,然后输出以十六进制格式的每个值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只有当size参数fread1回报是items读取的数目和每个项目是只等于1char类型的值。)

实施例利用/输出

$ 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 

查看示例并让我知道是否y你有任何问题。

0

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

您的声明char bytesFromBinary[256];保留256字节,fread填写全部256字节。没有尾随'\0',并且没有空间,所以内存中下一个发生的任何事情都会被覆盖/销毁。这已经会导致所有类型的随机错误和崩溃。

然后,在printf中,您尝试打印它,并且该函数将继续在内存中运行,直到碰巧遇到'\0'来停止它,所以如果程序使其停止,您将得到打印输出内存,可能很短,也可能是数千(不可打印)字符。

您需要声明变量总是再长一个,以便为尾部'\0'char bytesFromBinary[257];留出空间。更好的办法是在fread中使用sizeof(var)-1,或者在所需的长度上使用常量并用+1声明它。

+0

更改为'bytesFromBinary [257]'和相同的输出(无) – GregH

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

你的代码应该是成功的。

+0

我打开二进制模式,因为它是一个二进制文件。不知道你在说什么来解决这个问题 – GregH

+0

binary表示'不可打印的字符'。如果你尝试打印它们,你会得到奇怪的行为。 – Aganju

+0

这里的问题是*不*它不是以二进制模式打开的。 – immibis