在C語言中清空文件內容,最直觀的方法是用 fopen(path, "w") 截斷再關閉。但在系統編程、嵌入式開發或需精確控制文件描述符的場景下,使用 POSIX open() 系統調用配合 O_TRUNC 標誌是更底層、更高效的選擇。本文詳解實現原理與代碼實戰。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define PATHNAME "./test"
int main() {
// O_WRONLY: 只寫打開 | O_TRUNC: 截斷文件長度為 0
int fd = open(PATHNAME, O_WRONLY | O_TRUNC);
if (fd == -1) {
perror("open file failed");
return -1;
}
close(fd); // 關閉文件描述符,釋放資源
printf("文件 %s 已清空。\n", PATHNAME);
return 0;
}
O_TRUNC根據 man 2 open 手冊:
如果文件已存在且為普通文件,且以
O_WRONLY或O_RDWR成功打開,則將其長度截斷為 0,原有內容丟失。文件的擁有者、權限、時間戳等屬性保持不變。
組合使用邏輯:
O_WRONLY:聲明意圖為「寫入」,滿足 O_TRUNC 生效的前提條件。O_TRUNC:觸發截斷動作,直接在文件系統層面釋放數據塊,將文件大小設為 0。# 1. 建立測試文件並寫入內容
$ echo "這是測試內容,文件大小非零" > test
$ ll test
-rw-r--r-- 1 user user 45 10月 12 10:00 test
# 2. 編譯並運行清空程式
$ gcc truncate_file.c -o truncate
$ ./truncate
文件 ./test 已清空。
# 3. 驗證結果
$ ll test
-rw-r--r-- 1 user user 0 10月 12 10:01 test # 大小變為 0
$ cat test
# 無任何輸出,文件確已清空
| 方法 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
open(O_WRONLY|O_TRUNC) | 系統編程、守護進程、嵌入式、需精確控制 fd | 無緩衝區開銷、直接系統調用、可獲取 fd 進一步操作 | 錯誤處理較繁瑣、跨平台需條件編譯 |
fopen(path, "w") | 通用應用層開發 | 標準 C 庫、跨平台、自動緩衝、易用 | 隱式緩衝區、無法直接獲取 fd |
truncate(path, 0) / ftruncate(fd, 0) | 需指定截斷長度、或已持有 fd | 語義明確、可截斷到任意長度 | 需額外系統調用 |
open 返回 -1,errno 為 EACCES。ENOENT。O_TRUNC 行為未定義或報錯 EISDIR。flock/fcntl)。open() + O_TRUNC 是 C 語言系統級文件清空的標準姿勢,理解其背後的文件系統語義(釋放 inode 數據塊、更新元數據),有助於在高性能、資源受限環境下做出正確技術選型。