将文件读取为字节数组

33

我需要编写一个Huffman算法。关于问题的整体思路我已经清晰,但是文件处理方面还有些困惑。

问题在于:该算法需要压缩任何类型的文件。

我的解决方案是:将文件读取为字节数组,然后使用int array[256]={0}为每个字节获取其相应的int n值并递增array[n]。如果我表达不清楚,请让我知道。

因此,我进行了大量研究,但不理解如何获取和处理任何类型的文件字节。


我看到了许多关于这个主题的话题,但是没有一个对我来说很清楚。如果您有的话,请在此处提供链接。谢谢 :) - alissonlacerda
我看到了几个问题...首先,我会将您的文件加载到一个char array[]中。然后,使用普通的fopen()/fread()有什么问题,防止它打开任何类型的文件?最后,请尝试并报告其中的问题。 - Sigi
问题已编辑。删除了要求推荐一些离线资源的句子。 - alissonlacerda
问题已解决。感谢user1274193的帮助。现在我可以打开任何类型的文件并将其字节存储在数组中。 - alissonlacerda
2个回答

72
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

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


1
非常感谢!我离我想要的越来越近了。我会继续学习并进行一些测试。 - alissonlacerda
你应该在fclose之后调用"buffer[filelen] = '\0';"吗? - mexok
这在fseek()处给我一个分段错误。 - Singh
2
@Commander3000 如果整个数组被视为字符串,则NULL终止符是有意义的,但OP询问了关于读取二进制文件即“任何”类型的文件。 - Harry
2
我刚刚注意到上面的答案也假定了NULL终止,通过在调用malloc时添加一个额外的字节,这是不必要的。如果二进制文件有N个字节,则不需要为缓冲区分配(N + 1)个字节。 - Harry
1
这没有错误处理,它不会检查整个文件是否已读取完毕。为什么缓冲区的类型是char? - Aleksandr Dubinsky

-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[] 中,而这个答案被标记为不好,但没有任何评论,那么我什么也没学到。 - IAbstract
@IAbstract 使用指针算术读取数组是不被赞同的,因为它不安全且通常是糟糕的编码实践。请参考被接受的答案,了解正确的基于堆的缓冲区分配示例。 - belkarx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接