Linux 程式開發中,標準 I/O (ANSI C 標準庫) 與系統 I/O (POSIX 系統呼叫) 是檔案操作的兩大體系。本文整理兩者核心函式原型、回傳值、錯誤處理與適用場景對照。
特點: 帶緩衝、可移植、高層介面、支援格式化輸入輸出
| 函式 | 原型 | 回傳值 (成功) | 回傳值 (失敗) | 說明 |
|---|---|---|---|---|
| fopen | FILE *fopen(const char *pathname, const char *mode); | 檔案指標 FILE* | NULL | 開啟檔案,mode: r/w/a/r+/w+/a+ |
| fclose | int fclose(FILE *fp); | 0 | EOF | 關閉檔案流,刷新緩衝區 |
| fgetc | int fgetc(FILE *fp); | 讀取的字元 (unsigned char) | EOF | 讀取單一字元 |
| fputc | int fputc(int c, FILE *fp); | 寫入的字元 | EOF | 寫入單一字元 |
| fgets | char *fgets(char *buf, int n, FILE *fp); | buf 指標 | NULL | 讀取一行 (含換行符),最多 n-1 字元 |
| fputs | int fputs(const char *str, FILE *fp); | 非負值 | EOF | 寫入字串 (不含結束符) |
| fread | size_t fread(void *ptr, size_t size, size_t nmemb, FILE *fp); | 成功讀取的項目數 | 0 (或 < nmemb) | 二進制區塊讀取 |
| fwrite | size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *fp); | 成功寫入的項目數 | 0 (或 < nmemb) | 二進制區塊寫入 |
| fseek | int fseek(FILE *fp, long offset, int whence); | 0 | -1 | 移動檔案位置指標 |
| ftell | long ftell(FILE *fp); | 目前位移量 | -1 | 取得目前檔案位置 |
| rewind | void rewind(FILE *fp); | 無 | 無 | 位置歸零 |
| fflush | int fflush(FILE *fp); | 0 | EOF | 強制刷新輸出緩衝區 |
特點: 無緩衝 (直接系統呼叫)、低層介面、檔案描述子 (fd)、效能高、適合二進制/大量資料
| 函式 | 原型 | 回傳值 (成功) | 回傳值 (失敗) | 說明 |
|---|---|---|---|---|
| open | int open(const char *pathname, int flags, mode_t mode); | 檔案描述子 fd (>=0) | -1 | 開啟/建立檔案,flags: O_RDONLY/O_WRONLY/O_RDWR/O_CREAT/O_TRUNC/O_APPEND |
| close | int close(int fd); | 0 | -1 | 關閉檔案描述子 |
| read | ssize_t read(int fd, void *buf, size_t count); | 讀取位元組數 | -1 | 讀取資料到緩衝區 |
| write | ssize_t write(int fd, const void *buf, size_t count); | 寫入位元組數 | -1 | 從緩衝區寫入資料 |
| lseek | off_t lseek(int fd, off_t offset, int whence); | 新位移量 | -1 | 移動讀寫位置,whence: SEEK_SET/SEEK_CUR/SEEK_END |
| stat | int stat(const char *pathname, struct stat *buf); | 0 | -1 | 取得檔案狀態資訊 |
| fcntl | int fcntl(int fd, int cmd, ...); | 視 cmd 而定 | -1 | 檔案控制 (鎖定、非阻塞、關閉執行旗標等) |
| ioctl | int ioctl(int fd, unsigned long request, ...); | 0 | -1 | 裝置控制 (終端機、網路介面等) |
| 維度 | 標準 I/O (FILE*) | 系統 I/O (fd) |
|---|---|---|
| 緩衝機制 | 全緩衝/行緩衝/無緩衝 (自動) | 無緩衝 (直接進核心) |
| 可移植性 | 高 (ANSI C 標準) | POSIX 相容系統 |
| 格式化 I/O | 支援 (fprintf, fscanf) | 不支援 (需自行格式化) |
| 效能 | 中等 (用戶空間緩衝) | 高 (避免複製,適合大檔) |
| 檔案鎖定 | flockfile/funlockfile | fcntl/flock (更精細) |
| 適用場景 | 文字處理、格式化輸出、一般應用 | 二進制檔案、高效能、網路程式、裝置驅動 |
#include
#include
FILE *fp = fopen("file.txt", "r");
int fd = fileno(fp); // FILE* → fd
FILE *fp2 = fdopen(fd, "r"); // fd → FILE* (需注意緩衝區同步)
// 標準 I/O
FILE *fp = fopen("data.bin", "rb");
if (!fp) {
perror("fopen failed");
exit(EXIT_FAILURE);
}
// 系統 I/O
int fd = open("data.bin", O_RDONLY);
if (fd == -1) {
perror("open failed");
exit(EXIT_FAILURE);
}
// 統一使用 errno 檢查具體錯誤原因
#include
#include
if (errno == ENOENT) { /* 檔案不存在 */ }
if (errno == EACCES) { /* 權限不足 */ }
Linux 系統安全管理十大實戰技巧:從文件系統屬性到蜜罐部署
Windows 8 上市催化 Linux 桌面機會:OEM 廠商轉向、Ubuntu/Chrome OS 領銜、Mint 等小眾版本待突破
將 Nginx 註冊為系統服務:標準 init.d 腳本、chkconfig 整合、start/stop/restart/reload 操作
Linux 系統下 GPRS 無線 Modem 撥號上網完整教學
IAR 升級後編譯舊專案報錯 __get_PSP 不兼容的解決方案
Linux I2C 子系統 Platform 驅動模型深度解析:以 S3C2410 控制器為例