【问题标题】:C: Reading binary file outputing zeroesC:读取二进制文件输出零
【发布时间】:2018-05-12 12:01:56
【问题描述】:

我正在尝试从名为“binary.bin”的二进制文件中读取,该文件的内容为“this”。我期待它分别给我“t”、“h”、“i”、“s”的 ASCII 值,但它给了我 5 个零。

void bin_byte_by_byte(char *filename) {

  FILE *fptr;
  unsigned long len;
  int *buffer;

  fptr = fopen(filename, "rb");
  if(!fptr) {
    printf("error: file does not exist");
    return;
  }

  // get file lenght - create a function to this
  fseek(fptr, 0, SEEK_END);
  len = ftell(fptr);
  fseek(fptr, 0, SEEK_SET);

  buffer = (int*)malloc(sizeof(int) * len);
  if(!buffer) {
    printf("error: unable to allocate memory");
    fclose(fptr);
    return;
  }

  fread(&buffer, sizeof(buffer), len, fptr);

  printf("len = %d\n", len);
  for(int i = 0; i < len; i++) {
    printf("%d ", buffer[i]);
  }

  if(fclose(fptr) != 0) {
    printf("File did not close as expected");
  }

  free(buffer);
}

【问题讨论】:

  • 检查相关系统调用的结果不仅仅是免费调试,而且对于编写可靠的,即可用的代码至关重要。提示:记录、阅读并理解 fread() 返回的内容。
  • 顺便说一句,在 C 语言中,不需要malloc() 转换为/从任何其他void-指针转换。

标签: c file pointers


【解决方案1】:

您的文件应该是二进制文件,但您似乎将一个文本文件传递给您的程序。该文件为 5 个字节,适合内容“this”。如果您将此文件作为二进制文件读取,则读取字节而不是整数可能是有意义的。如果要将字节读入 int 数组,则应按字节读取并将每个字节存储到 int 数组的一个位置。

在您列出的程序中很少有错误。

buffer = (int*)malloc(sizeof(int) * len);

上面的行创建了一个由 5 个整数组成的数组。所以,它需要 20 个字节(假设是 32 位平台)。

然后你从文件中读取:

fread(&buffer, sizeof(buffer), len, fptr);

这一行从文件中读取了 20 个字节,尽管它只有 5 个字节长。此外,您传递指针变量的地址,但您需要传递缓冲区的地址。所以,它应该只是缓冲区而不是 &buffer

但这里的重点是缓冲区 [0] 中有 4 个字节。所以,'t', 'h', 'i', 's' 转到缓冲区的第一个元素。

因此,您可以使用 char 作为数组类型,也可以逐字节读取并将每个字节存储到缓冲区的单独元素中

【讨论】:

  • "但这里的重点是缓冲区 [0] 进入 4 个字节。" 如果他们愿意,他们不会因为 OP 通过 fread() 的地址错误
  • @alk:是的,你是对的。代码中的问题太多了。如果地址正确,就会发生这种情况。只是想尽可能多地解决问题
猜你喜欢
  • 2014-03-24
  • 2021-05-25
  • 2017-10-01
  • 2011-09-03
  • 2016-01-15
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 2011-02-03
相关资源
最近更新 更多