读取字符串中的二进制文件显示奇怪的输出

时间:2015-11-29 20:33:11

标签: c file binaryfiles fread

所以,这是我的情景:

我有一个二进制文件,我得到的信息是:文件大小是1kb,文件中只有字符,文件是二进制文件。

所以,我尝试阅读并打印前128个字符来测试这样做:

FILE *f;
if((f = fopen(argv[1],"rb")) == NULL){ 
    printf("CANNOT OPEN FILE\n");
    exit(1);
}

char buffer[128];
printf("%d\n",fread(buffer, sizeof(char), 128, f));
printf("%s", buffer);

但是输出看起来根本不是一个128长的字符串,输出是这样的: 1XZ%] X ^ԫƛTtA=܇p为H.!银>〜K *; 2

有谁知道我的错误是什么?

2 个答案:

答案 0 :(得分:1)

  1. 如果您的文件包含非ASCII字符,结果将显示为垃圾。

  2. 如果您的读取失败,那么缓冲区将被取消初始化,结果将看起来像垃圾。

  3. 如果没有" NULL"终结者,然后你的一些 - 或全部 - 输出看起来像垃圾。

  4. 即使缓冲区打印出垃圾 - 并且存在NULL字符 - 输出也会以' \ 0'

  5. 结束。

    建议:

    查看记事本中的文件。或者,更好的是,在十六进制编辑器中查看它。

    Linux有一个"strings"命令,它只打印二进制文件中的文本字符串。您可以下载Windows版本的"字符串"这里:

    https://technet.microsoft.com/en-us/sysinternals/strings.aspx

答案 1 :(得分:1)

将数据读入缓冲区后,尝试打印字符的ASCII码。这将表明字符是否可打印。

char buffer[128];
int n = fread(buffer, sizeof(char), 128, f);
for (int i = 0; i < n; ++i)
{
   printf("i: %d, ASCII code: %d\n", i, buffer[i]);
}