问题分析
1. 文本模式 vs 二进制模式
你使用 fopen("D://fa1.txt", "w") 打开了文件,这是文本模式。在Windows系统中:
-
文本模式下,每个换行符
\n(0x0A) 会被自动转换为\r\n(0x0D 0x0A) -
如果你的
feture1数组中包含\n字符,每个都会增加1字节
2. 计算过程
假设你的2560字节数据中包含13个 \n 字符:
-
原始大小:2560字节
-
每个
\n被替换为\r\n,增加1字节 -
最终大小:2560 + 13 = 2573字节
解决方案
1. 使用二进制模式写入(推荐)
FILE *file = fopen("D://fa1.txt", "wb"); // 注意 "wb" 而不是 "w"
if (file == NULL) {
perror("Error creating file");
return;
}
// 写入数据
for (int i = 0; i < sizeof(feture1); i++) {
fputc(feture1[i], file);
}
// 获取文件大小
fseek(file, 0, SEEK_END);
long file_size = ftell(file);
rewind(file);
fclose(file);
printf("文件大小: %ld 字节\n", file_size);
2. 使用 fwrite 函数(更高效)
FILE *file = fopen("D://fa1.txt", "wb");
if (file == NULL) {
perror("Error creating file");
return;
}
// 一次性写入整个数组
size_t written = fwrite(feture1, 1, sizeof(feture1), file);
printf("成功写入 %zu 字节\n", written);
fseek(file, 0, SEEK_END);
long file_size = ftell(file);
fclose(file);
printf("文件大小: %ld 字节\n", file_size);
关键点总结
1. **文本模式 ("w")**:会进行换行符转换,可能导致文件大小变化
2. **二进制模式 ("wb")**:保持数据原样,不会进行任何转换
3. **对于二进制数据**(如图像特征、序列化数据等),总是使用二进制模式
使用 `"wb"` 模式后,文件大小应该正好是写入的字节数。