【发布时间】: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"模式。 -
除此之外,如果您真的使用
getc和putc一次处理这个字节,您将获得更接近epsilon 的性能。仅供参考,while (!feof(input))is wrong。您将在输出文件中得到一个重复的最终字节。它可以/可以通过正确的控制循环和/或实际验证您的 IO(无论如何您都应该这样做)而不是忽略函数调用结果来规避。 -
使用 fgetc 和 fputc。
-
"它只读取几个字节" --> 很好奇,这是怎么确定的?