首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 语言文件复制:二进制模式逐字节复制实现

     編輯:關於C語言

核心代码

#include <stdio.h>

int main() {
    FILE *src = fopen("1.tar.gz", "rb");
    FILE *dst = fopen("2.tar.gz", "wb");
    if (!src || !dst) { perror("fopen"); return 1; }

    int ch;
    while ((ch = getc(src)) != EOF) {
        putc(ch, dst);
    }

    fclose(dst);
    fclose(src);
    return 0;
}

关键点解析

  1. 二进制模式 "rb"/"wb":Windows 下文本模式会转换 \n↔\r\n,破坏二进制文件(如压缩包、图片)。跨平台复制必须用二进制模式。
  2. int ch 而非 char:EOF 通常为 -1,char 可能是有符号或无符号,若为无符号则永远不等于 EOF 导致死循环。用 int 可正确区分有效字节 0xFF 与 EOF。
  3. 逐字节复制效率较低:每字节一次函数调用与系统调用。大文件建议使用缓冲块复制:
char buf[4096];
size_t n;
while ((n = fread(buf, 1, sizeof(buf), src)) > 0) {
    fwrite(buf, 1, n, dst);
}

或使用 sendfile (Linux)、CopyFile (Windows) 等零拷贝/系统级 API 进一步提速。

错误处理增强版

#include <stdio.h>
#include <stdlib.h>

int copy_file(const char *src_path, const char *dst_path) {
    FILE *src = fopen(src_path, "rb");
    if (!src) { perror("open src"); return -1; }
    FILE *dst = fopen(dst_path, "wb");
    if (!dst) { perror("open dst"); fclose(src); return -1; }

    char buf[8192];
    size_t n;
    while ((n = fread(buf, 1, sizeof(buf), src)) > 0) {
        if (fwrite(buf, 1, n, dst) != n) { perror("write"); fclose(src); fclose(dst); return -1; }
    }
    if (ferror(src)) { perror("read"); fclose(src); fclose(dst); return -1; }

    fclose(dst);
    fclose(src);
    return 0;
}

int main(int argc, char **argv) {
    if (argc != 3) { fprintf(stderr, "Usage: %s  \n", argv[0]); return 1; }
    return copy_file(argv[1], argv[2]);
}

总结

文件复制看似简单,关键在于二进制模式、EOF 正确判断、缓冲块读写与完整错误处理。生产代码请直接使用成熟库函数(std::filesystem::copy C++17、boost::filesystem::copy_file、CopyFileEx 等),避免重复造轮子。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved