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

C 語言檔案操作完整指南:開關、讀寫、二進制與加密實戰

     編輯:C 語言入門

一、檔案開啟與關閉

fopen - 開啟檔案

FILE *fopen(const char *filename, const char *mode);

回傳 FILE* 指標,失敗回傳 NULL。常用模式:

模式說明
r / rb唯讀開啟文字/二進制檔,檔案必須存在
w / wb唯寫建立/截斷文字/二進制檔
a / ab附加寫入文字/二進制檔,不存在則建立
r+ / rb+讀寫開啟現有文字/二進制檔
w+ / wb+讀寫建立/截斷文字/二進制檔
a+ / ab+讀寫附加開啟文字/二進制檔

錯誤處理範例:

FILE *fp = fopen("D:\\demo.txt", "rb");
if (fp == NULL) {
    perror("開啟失敗");
    exit(EXIT_FAILURE);
}

fclose - 關閉檔案

int fclose(FILE *fp); // 成功返回 0,失敗非 0

二、文字檔 vs 二進制檔

  • 文字檔:以 ASCII 碼儲存,換行符 \n 在 Windows 可能轉為 \r\n,讀取遇 0x1A(Ctrl+Z) 視為 EOF。
  • 二進制檔:位元級原始儲存,無任何轉換,適合圖片、影音、結構體序列化。

三、字元級讀寫:fgetc / fputc

int fgetc(FILE *fp);       // 讀取單一字元,EOF 表結束或錯誤
int fputc(int ch, FILE *fp); // 寫入單一字元

完整複製範例:

FILE *fp = fopen("src.txt", "r");
FILE *wp = fopen("dst.txt", "w");
int ch;
while ((ch = fgetc(fp)) != EOF) fputc(ch, wp);
fclose(fp); fclose(wp);

注意:EOF 為負值(通常 -1),故接收變數須為 int。可用 feof()、ferror() 區分結束與錯誤。

四、字串級讀寫:fgets / fputs

char *fgets(char *str, int n, FILE *fp); // 讀取 n-1 字元或換行
int fputs(const char *str, FILE *fp);    // 寫入字串(不含 \0)

逐行讀取範例:

#define MAX_LINE 1024
char line[MAX_LINE];
while (fgets(line, MAX_LINE, fp) != NULL) {
    printf("%s", line); // fgets 保留換行符
}

五、區塊級讀寫:fread / fwrite(二進制首選)

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *fp);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *fp);

二進制檔案複製(含圖片):

FILE *rfp = fopen("src.png", "rb");
FILE *wfp = fopen("dst.png", "wb");
char buf[4096];
size_t len;
while ((len = fread(buf, 1, sizeof(buf), rfp)) > 0) {
    fwrite(buf, 1, len, wfp);
}
fclose(rfp); fclose(wfp);

六、隨機存取:fseek / ftell / rewind

fseek(fp, 0, SEEK_END);      // 移至檔尾
long fsize = ftell(fp);      // 取得檔案大小
fseek(fp, 0, SEEK_SET);      // 回到檔首

七、實戰:XOR 檔案加密/解密

利用 A ^ key ^ key = A 特性,對每個位元組異或固定金鑰(如 8)。

void encrypt_file(const char *in, const char *out, unsigned char key) {
    FILE *fin = fopen(in, "rb");
    FILE *fout = fopen(out, "wb");
    int ch;
    while ((ch = fgetc(fin)) != EOF) fputc(ch ^ key, fout);
    fclose(fin); fclose(fout);
}
// 解密同樣呼叫 encrypt_file,金鑰相同即可

總結

掌握 fopen 模式、三層級讀寫 API、隨機存取與錯誤處理,即可應付絕大多數 C 語言檔案操作場景。加密範例展示了二進制流處理的靈活性,後續可延伸至 JNI/NDK 實作更複雜的加密協定。

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