Linux 下 C語言 open() 和 fopen() 區別
阿新 • • 發佈:2018-11-29
fopen()
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
mode
指定檔案的開啟模式:
- r:只讀方式開啟一個文字檔案(該檔案必須存在)
- r+:可讀可寫方式開啟一個文字檔案(該檔案必須存在)
- w:只寫方式開啟一個文字檔案(若檔案存在則檔案長度清為0,即該檔案內容會消失。若檔案不存在則建立該檔案)
- w+:可讀可寫方式建立一個文字檔案(若檔案存在則檔案長度清為零,即該檔案內容會消失。若檔案不存在則建立該檔案)
- a:追加方式開啟一個文字檔案(若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的內容會被保留。(EOF符保留))
a+:可讀可寫追加方式開啟一個文字檔案(若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾後,即檔案原先的內容會被保留。 (原來的EOF符不保留))
a 和 a+ 的區別:a 不能讀,a+ 可以讀
- rb:只讀方式開啟一個二進位制檔案(使用法則同r)
- rb+:可讀可寫方式開啟一個二進位制檔案(使用法則同r+)
- wb:只寫方式開啟一個二進位制檔案(使用法則同w)
- wb+:可讀可寫方式生成一個二進位制檔案(使用法則同w+)
- ab:追加方式開啟一個二進位制檔案(使用法則同a)
ab+:可讀可寫方式追加一個二進位制檔案(使用法則同a+)
返回值
fopen() 的返回值是一個 FILE 型別的指標,若開啟失敗則返回 NULL。
open()
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
flags
用於指定檔案的開啟/建立模式,這個引數可由以下三個互斥的常量(定義於 fcntl.h)通過邏輯或(|)連線:
O_RDONLY 只讀模式
O_WRONLY 只寫模式
O_RDWR 讀寫模式
其他可選常量:
常量 | 含義 |
---|---|
O_APPEND | 每次寫操作都寫入檔案的末尾 |
O_CREAT | 如果指定檔案不存在,則建立這個檔案 |
O_EXCL | 如果要建立的檔案已存在,則返回 -1,並且修改 errno 的值 |
O_TRUNC | 如果檔案存在,並且以只寫/讀寫方式開啟,則清空檔案全部內容 |
O_NOCTTY | 如果路徑名指向終端裝置,不要把這個裝置用作控制終端 |
O_NONBLOCK | 如果路徑名指向 FIFO/塊檔案/字元檔案,則把檔案的開啟和後繼 I/O設定為非阻塞模式(nonblocking mode) |
以下用於同步輸入輸出
常量 | 含義 |
---|---|
O_DSYNC | 等待物理 I/O 結束後再 write。在不影響讀取新寫入的資料的前提下,不等待檔案屬性更新 |
O_RSYNC | read 等待所有寫入同一區域的寫操作完成後再進行 |
O_SYNC | 等待物理 I/O 結束後再 write,包括更新檔案屬性的 I/O |
mode
和 fopen() 函式的 mode
引數相同。
需要注意的是,當 flags
為 O_CREAT 或 O_TMPFILE 時,必須提供 mode
引數;否則 mode
引數將不起作用。
返回值
open() 的返回值是一個 int 型別的檔案描述符,開啟失敗返回 -1。
區別
- 前者(open)屬於低階IO,後者(fopen)是高階IO。
- 前者返回一個檔案描述符,後者返回一個檔案指標。
- 前者無緩衝,後者有緩衝。
- 前者與 read, write 等配合使用, 後者與 fread, fwrite等配合使用。
- 後者是在前者的基礎上擴充而來的,在大多數情況下,用後者。
- fopen() 是 C 標準庫中的函式,而 open() 是 Linux 中的系統呼叫函式。
參考
http://man7.org/linux/man-pages/man2/open.2.html
http://man7.org/linux/man-pages/man3/fopen.3p.html