【问题标题】:C: How to read a file (of any format) byte by byte?C:如何逐字节读取文件(任何格式)?
【发布时间】:2021-03-05 09:16:14
【问题描述】:

我正在尝试编写一个代码,该代码将逐字节读取任何类型/格式的文件。 对于初学者,我希望能够读取和写入同一个文件,但是对于文本文件以外的任何文件,我都无法做到这一点。

在这里搜索后,我认为fread/fwrite 应该可以工作

unsigned char buff;
fopen_s(&input, "input_file_of_any_kind", "r");
fopen_s(&output, "new", "w");
while (!feof(input))
{
    fread(&buff, 1, 1, input);
    fwrite(&buff, 1, 1, output);
}
fclose(input);
fclose(output);

但是当我试图“复制”一个 jpg 或 pdf 文件时,它只读取几个字节(超出 KB),所以我想我的理解是有缺陷的。你能指出我正确的方向吗? 这样做的目的是以位表示这些字节并对其进行操作(它应该适用于任何大小的文件)。

【问题讨论】:

  • "r" -> "rb"。在某些以文本模式读取文件的系统上,可能会进行一些删除或添加字节的翻译,或者可能意味着文件过早结束。
  • 试试"rb""wb"模式。
  • 除此之外,如果您真的使用getcputc 一次处理这个字节,您将获得更接近epsilon 的性能。仅供参考,while (!feof(input)) is wrong。您将在输出文件中得到一个重复的最终字节。它可以/可以通过正确的控制循环和/或实际验证您的 IO(无论如何您都应该这样做)而不是忽略函数调用结果来规避。
  • 使用 fgetc 和 fputc。
  • "它只读取几个字节" --> 很好奇,这是怎么确定的?

标签: c file-io fwrite fread


【解决方案1】:

要读取任意大小的文件(逐字节),一种简单的方法是使用fgetc()

打开二进制文件并检查结果。

// fopen_s(&input, "input_file_of_any_kind", "r");
if (fopen_s(&input, "input_file_of_any_kind", "rb")) {
  ; // Handle error
}

不要不要使用while (!feof(input))

int ch;
while ((ch = fgetc(input)) != EOF) {
    fputc(ch, output);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    相关资源
    最近更新 更多