C中的指针与二进制文件

时间:2010-04-05 20:33:47

标签: c pointers

我正在使用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

4 个答案:

答案 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