【问题标题】:Read a file as byte array [closed]将文件读取为字节数组[关闭]
【发布时间】:2014-03-30 07:57:52
【问题描述】:

我有一个编写霍夫曼算法的任务。我已经在脑海中整理了整个问题,但我在处理文件时遇到了一些问题。

问题是:算法应该压缩ANY类型的文件。

我的解决方案:将文件作为字节数组读取,然后为每个字节使用int array[256]={0},获取它的int n 对应值并增加array[n]。如果我没有说清楚,请告诉我。

所以,我做了很多研究,但不明白如何从任何类型的文件中获取字节以及如何处理它们。

【问题讨论】:

  • 我看到了很多关于这个主题的话题,但我都不清楚。我是这么说的,请在这里链接一个。谢谢:)
  • 我发现了几个问题...首先我会将您的文件加载到char array[]。比普通的fopen()/fread() 阻止它打开 any 类型的文件有什么问题?最后,请尝试并报告它有什么问题。
  • 问题已编辑。删除了要求推荐一些场外资源的句子。
  • 问题已解决。感谢用户 1274193。现在我可以打开任何类型的文件并将其字节存储在一个数组中。

标签: c file-io huffman-code


【解决方案1】:
FILE *fileptr;
char *buffer;
long filelen;

fileptr = fopen("myfile.txt", "rb");  // Open the file in binary mode
fseek(fileptr, 0, SEEK_END);          // Jump to the end of the file
filelen = ftell(fileptr);             // Get the current byte offset in the file
rewind(fileptr);                      // Jump back to the beginning of the file

buffer = (char *)malloc(filelen * sizeof(char)); // Enough memory for the file
fread(buffer, filelen, 1, fileptr); // Read in the entire file
fclose(fileptr); // Close the file

现在你有了一个包含文件内容的字节数组。

【讨论】:

  • 非常感谢!我越来越接近我想要的了。我会多学习并做一些测试。
  • 你不应该调用“buffer[filelen] = '\0';”在 fclose 之后?
  • 我刚刚注意到上面的答案也是通过在对 malloc 的调用中添加一个额外的字节来假设 NULL 终止,它不应该。如果二进制文件有 N 个字节,则不需要为缓冲区分配 (N + 1) 个字节。
  • 这没有错误处理,它不检查整个文件是否已被读取。为什么缓冲区的类型是char?
【解决方案2】:

试试二进制文件IO怎么样:

  FILE *f=fopen("example.bin","rb");
  char c;
  //loop for each byte to the end
  {
    size_t fread(&c, (size_t)1, (size_t) 1, f);
    array[c]++;
  }

或者类似的东西!!

【讨论】:

  • 如果我试图完成将文件读入byte[] 并且这个答案被标记为没有评论,我什么也没学到。
猜你喜欢
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
相关资源
最近更新 更多