所以,这是我的情景:
我有一个二进制文件,我得到的信息是:文件大小是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
有谁知道我的错误是什么?
答案 0 :(得分:1)
如果您的文件包含非ASCII字符,结果将显示为垃圾。
如果您的读取失败,那么缓冲区将被取消初始化,结果将看起来像垃圾。
如果没有" NULL"终结者,然后你的一些 - 或全部 - 输出看起来像垃圾。
即使缓冲区打印出垃圾 - 并且存在NULL字符 - 输出也会以' \ 0'
建议:
查看记事本中的文件。或者,更好的是,在十六进制编辑器中查看它。
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]);
}