【问题标题】:Pointers in C with binary fileC中的指针与二进制文件
【发布时间】:2010-04-05 20:33:47
【问题描述】:

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

输出什么也不打印。我哪里错了?

问候, 小黑子

【问题讨论】:

  • 不要在 fread() 函数中编码“4”,您可以尝试:sizeof(chunk)。

标签: c pointers


【解决方案1】:

printf 移动到循环中。实际上,您只打印最后读取的块。

编辑: 显然,我读了这个问题,但没有读到标题。您必须这样做像 Thomas 所说的那样切换到 fwrite

【讨论】:

    【解决方案2】:

    在我看来,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);
    }
    

    当我在一个包含每个字节的文件上运行这个程序 sn-p 时,很明显许多值在解释为字符时没有意义:

    [snip...]
    29 ->
    30 ->
    31 ->
    32 ->
    33 -> !
    34 -> "
    35 -> #
    36 -> $
    37 -> %
    38 -> &
    39 -> '
    [...more snipping]
    

    【讨论】:

      【解决方案3】:

      您不能使用printf 打印二进制文件。 printf 会将二进制 blob 视为以 null 结尾的字符串,因此恰好在您的块中的任何 '\0' 字节都将结束“字符串”。

      要将块完整写入标准输出,请使用fwrite

      fwrite(chunk, sizeof(char), 4, stdout);
      

      【讨论】:

      • 嗨,我的问题很愚蠢。我使用上面的语句并使用 fprintf 来打印标准输出。但仍然没有显示任何内容。很抱歉考验你的耐心..但你能告诉我哪里出错了
      • 当然你可以使用 printf 打印一个二进制文件。问题在于 %s 格式。但是 %d 或 %c 可以正常工作,具体取决于 darkie15 期望二进制数据的样子。
      【解决方案4】:

      稍微解构你的源代码:

      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] 需要是可打印的(即 isprint(chunk[i]) == 1),并且块 [ 3] 最好总是为 0,否则你会得到一些奇怪的输出。由于二进制文件中很少出现这种情况,因此您可能希望更改编写该输出的方式。

      以下是如何将单个字节打印为整数值:

      printf("chunk: ");
      for (i = 0; i < sizeof chunk; i++)
        printf("%02x ", chunk[i];
      putchar('\n');
      

      【讨论】:

        猜你喜欢
        • 2015-08-22
        • 2015-04-08
        • 1970-01-01
        • 1970-01-01
        • 2015-07-18
        • 2018-10-04
        • 2015-04-02
        • 2020-11-24
        • 1970-01-01
        相关资源
        最近更新 更多