You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:05:18