Linux 下 C語言 open() 和 fopen() 區別


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM