我正在使用fread将文件内容读入char数组。但我不确定为什么它不会在输出中打印出来。这是代码:
void getInfo(FILE* inputFile)
{
char chunk[4];
int liIndex;
for (liIndex = 0 ; liIndex < 4 ; liIndex++)
{
fread(chunk, sizeof(char), 4, inputFile);
}
printf("\n chunk %s", chunk);
}
输出完全没有打印。我哪里错了?
问候, darkie
答案 0 :(得分:3)
将printf
移动到循环中。实际上,您只打印最后一个块读取。
编辑:我显然是在阅读问题而不是标题。你必须这样做和切换到fwrite
,就像托马斯所说。
答案 1 :(得分:3)
在我看来,fread和fwrite只会增加一层混乱。
尝试使用面向字节的输入和输出函数,因为4字节块根本不比不使用块更好,并且你不能在你不写的代码中出错。
int ch;
while ((ch = getc(inputFile)) != EOF)
putchar(ch);
但我认为这里真正的问题是你可能不完全理解你的要求。您正在读取二进制数据,然后尝试将其打印为字符数据;许多任意字节值与任何可打印字符都不对应。你期望看到这些字节是什么?
更具信息性的方法可能是打印出每个字节的整数值,以及它所代表的字符。当文件中有不可打印的字符时,这将让您清楚地看到。
例如
void func(FILE *s)
{
int ch;
while ( (ch = getc(s)) != EOF )
printf("%d -> %c\n", ch, ch);
}
当我在包含每个字节之一的文件上运行此程序片段时,很明显,当解释为字符时,许多值没有意义:
[snip...]
29 ->
30 ->
31 ->
32 ->
33 -> !
34 -> "
35 -> #
36 -> $
37 -> %
38 -> &
39 -> '
[...more snipping]
答案 2 :(得分:2)
您无法使用printf
打印二进制文件。 printf
会将二进制blob视为以空字符结尾的字符串,因此恰好位于块中的任何'\0'
字节都将结束“字符串”。
要将块完整地写入stdout,请使用fwrite
:
fwrite(chunk, sizeof(char), 4, stdout);
答案 3 :(得分:1)
稍微解构一下你的源代码:
void getInfo(FILE* inputFile)
{
char chunk[4];
int liIndex;
for (liIndex = 0 ; liIndex < 4 ; liIndex++)
{
fread(chunk, sizeof(char), 4, inputFile);
你一次读4个字节,重复4次;这意味着当循环退出时,您已读取16个字节,而块包含字节12-16。这是你的意图吗?如果您只想读取前四个字节,请抛弃循环并只调用fread
一次。如果你想读取并打印前16个字节,那么你还需要将输出语句移动到循环中。
正如其他人所提到的,不要硬编码4;请改用sizeof chunk
。
}
printf("\n chunk %s", chunk);
}
请记住,%s
转换说明符要求相应的参数指向0终止的可打印字符序列,因此chunk[0]
到chunk[2]
需要是可打印的(即{{ 1}}),而chunk [3]最好总是0,否则你可能得到一些奇怪的输出。由于在二进制文件中很少出现这种情况,您可能希望更改编写该输出的方式。
以下是如何将各个字节打印为整数值:
isprint(chunk[i]) == 1