C:读取二进制文件输出零

标签 c file pointers

我正在尝试读取一个名为“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);
}

最佳答案

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

您列出的程序中几乎没有错误。

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

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

然后你从文件中读取:

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

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

但要点是,buffer[0] 中有 4 个字节。因此,'t'、'h'、'i'、's' 转到缓冲区的第一个元素。

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

关于C:读取二进制文件输出零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50306013/

相关文章:

c - 如何理解虚拟内存?

c - 递增 struct* 中 int* 指向的值

c# - 将 C++ 字符数组转换为 C# 字符串

c - 在 fread(3) 中检查读取的项目数是否小于请求的数量,而不是 0,是否正确?

objective-c - 使用 RubyMotion 处理指针

c - 指向二维结构数组的指针

c++ - 如何使用函数(而非构造函数)将派生类对象分配给基类指针

C编程: A Modern Approach - chapter 10 project 6 - confused

C# 2Gb 文件在 Ram 中是 4gb。为什么?

ios - 我有自定义文件类型,如何让其他 iOS 应用程序打开它?