c - 无法在c中读取整个文件
问题描述
我正在尝试将内容从一个文件移动到另一个文件。
我的代码:
char *path = extractFileName(args[1]);
if (path == 0)
return -1;
FILE *input = fopen(path, "r");
rewind(input);
fseek(input, 0L, SEEK_END);
long sz = ftell(input);
printf("sz: %ld\n", sz);
rewind(input);
size_t a;
FILE *result = fopen("result.mp3", "w");
size_t counter = 0;
char buffer[128];
while ((a = fread(&buffer[0], 1, 128, input)) != 0) {
fwrite(&buffer[0], 1, a, result);
counter += a;
}
printf("%d\n", counter);
printf("ferror input: %d\n", ferror(input));
printf("feof input: %d\n", feof(input));
执行后打印
sz: 6675688
25662
ferror input: 0
feof input: 16
据我所知,这意味着 C 知道输入文件的大小为 665kb,但当我尝试读取超过 25662 个字节时返回 eof。我做错了什么?
解决方案
由于您的输出文件名是result.mp3
,因此可以肯定您正在处理非文本数据。这意味着您应该分别以二进制模式打开"rb"
文件"wb"
。如果您在 Windows 上运行此代码,则不这样做会解释您所看到的行为(在该平台上,以文本模式读取特定字节(0x1A)会导致它发出文件结束信号,即使它实际上不是结束),并且使用二进制模式将修复它。在其他操作系统上,它是无操作的,但仍会引导读者了解您的意图和您期望使用的数据类型,因此即使它们并不严格需要它也是一个好主意。
推荐阅读
- macos - Mac OS Catalina VM 加入本地主机
- python - Python Multiprocessing apply_async 不可腌制?
- hive - 为什么这样的输出为什么第二行在第二列中给出NULL值选择堆栈(2,'A',10,日期'2015-01-01',1,'B',日期'2015-02-02', 2)
- c - C 编程中的枚举用户定义数据类型
- c# - Hangfire 1.7.8 服务 Dotnetcore 3.1 具有许多 TimerQueueTimer 实例的高内存使用率
- python-3.x - 如何从数据集中删除重复的行,其中也包括重复的字典?
- mysql - 查询拆分偶数和奇数,使用 GROUP_CONCAT
- python - DRF 序列化程序通过 REST API 与第三方应用程序一起操作
- java - 我可以在不重新运行迁移的情况下修复 Flyway 中的版本号吗?
- mulesoft - 如何让 MUnit DB 服务器从 CSV 文件创建表