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);
}
int fclose(FILE *fp); // 成功返回 0,失敗非 0
\n 在 Windows 可能轉為 \r\n,讀取遇 0x1A(Ctrl+Z) 視為 EOF。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() 區分結束與錯誤。
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 保留換行符
}
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(fp, 0, SEEK_END); // 移至檔尾
long fsize = ftell(fp); // 取得檔案大小
fseek(fp, 0, SEEK_SET); // 回到檔首
利用 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 實作更複雜的加密協定。