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

C 語言文件復制:二進制逐字節讀寫的兩種實現

     編輯:關於C語言

C 語言文件復制:二進制逐字節讀寫的兩種實現

核心思路

以二進制模式("rb"/"wb")打開源文件與目標文件,逐字節讀取源文件並寫入目標文件,直到 EOF。此法適用於**任意文件類型**(文本、圖片、可執行文件等),也是遠程文件傳輸的基礎邏輯。

關鍵點:以字節為單位讀寫

  • void* 指針與 char 類型佔用 1 字節,適合作為字節緩衝區。
  • 數據類型不限制存儲內容,char 可存放任意 8 位模式(256 種可能),非僅限字符。

方法一:使用 void* 緩衝區

void *buf;
while (!feof(fp_src)) {
    fread(&buf, 1, 1, fp_src);   // 讀 1 字節到 buf
    fwrite(&buf, 1, 1, fp_dst);  // 寫 1 字節從 buf
}

方法二:使用 char 緩衝區(推薦)

char c;
while (!feof(fp_src)) {
    fread(&c, 1, 1, fp_src);
    fwrite(&c, 1, 1, fp_dst);
}

完整可運行示例

#include 

int main() {
    FILE *fp_src = fopen("a.png", "rb");
    FILE *fp_dst = fopen("b.png", "wb");
    if (!fp_src || !fp_dst) return -1;

    char c;
    while (!feof(fp_src)) {
        fread(&c, 1, 1, fp_src);
        fwrite(&c, 1, 1, fp_dst);
    }

    fclose(fp_src);
    fclose(fp_dst);
    printf("over\n");
    return 0;
}

效率優化建議

逐字節調用 fread/fwrite 開銷大。實際項目建議:

  1. 定義較大緩衝區(如 4KB~64KB):char buf[4096];
  2. 讀取實際字節數:size_t n = fread(buf, 1, sizeof(buf), fp_src);
  3. 寫入相同字節數:fwrite(buf, 1, n, fp_dst);
  4. 循環直到 n == 0。

進階:精確控制文件大小

若需確保目標文件大小**完全等於**源文件(避免多讀多寫),可先獲取源文件大小:

fseek(fp_src, 0, SEEK_END);
long fsize = ftell(fp_src);
fseek(fp_src, 0, SEEK_SET);
// 然後分塊讀寫,最後一塊精確控制長度

總結

二進制逐字節復制是 C 語言文件操作基礎,掌握 fread/fwrite 配合 char 緩衝區的模式,並理解「類型不限制內容」的指針本質,可構建任意文件復制、傳輸、備份工具。生產環境務必使用塊讀寫優化性能。

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