C语言中以字节数组读写图片文件,复制文件损坏问题排查
问题:复制图片文件后生成的文件损坏,原因是什么?
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { FILE* file = fopen("pexels.jpg", "r"); if (!file) { perror("File opening failed"); return EXIT_FAILURE; } fseek(file, 0, SEEK_END); long file_size = ftell(file); fseek(file, 0, SEEK_SET); void* data = malloc(file_size); memset(data, 0, file_size); fread(data, 1, file_size, file); fclose(file); FILE *copy = fopen("copy.jpg", "w"); if (!copy) { perror("File opening failed"); free(data); return EXIT_FAILURE; } fwrite(data, 1, file_size, copy); free(data); fclose(copy); }
原因分析
核心问题是用文本模式处理二进制文件,在Windows平台下会直接篡改字节内容:
- 读文件时用
"r"(文本模式):Windows系统会自动把文件中的\r\n转换成\n,还会把字节0x1A当作文件结束标志提前终止读取,导致实际读到的字节数比真实文件大小少,内存里的数据不完整。 - 写文件时用
"w"(文本模式):会把内存中的\n自动转换成\r\n,改变了原文件的字节结构,破坏了图片的格式校验信息。
修复方案
把文件打开模式改成二进制模式即可:
- 读文件用
"rb"(read binary) - 写文件用
"wb"(write binary)
修改后的关键代码片段:
FILE* file = fopen("pexels.jpg", "rb"); // ... FILE *copy = fopen("copy.jpg", "wb");
另外补充:memset(data, 0, file_size)属于多余操作,fread会直接覆盖内存内容,完全可以删掉。
内容的提问来源于stack exchange,提问作者Alex Butane
相关产品推荐
相关产品推荐

