Python fopen,open,和popen的區別

Dus發表於2015-02-09

1.  fopen    

  • 開啟普通檔案
  • 帶緩衝區撒點粉撒點粉阿桑地方
  • 緩衝檔案系統是藉助檔案結構體指標來對檔案進行管理,通過檔案指標來對檔案進行訪問,既可以讀寫字元、字串、格式化資料,也可以讀寫二進位制資料

函式原型:FILE * fopen(const char * path,const char * mode);

所需庫:<stdio.h>
返回值:檔案順利開啟後,指向該流的檔案指標就會被返回。如果檔案開啟失敗則返回NULL,並把錯誤程式碼存在errno 中。
引數說明:
引數path字元串包含欲開啟的檔案路徑及檔名,引數mode字串則代表著流形態
mode有下列幾種形態字串:
r 以只讀方式開啟檔案,該檔案必須存在。
r+ 以可讀寫方式開啟檔案,該檔案必須存在。
rb+ 讀寫開啟一個二進位制檔案,允許讀寫資料
rw+ 讀寫開啟一個文字檔案,允許讀和寫。
w 開啟只寫檔案,若檔案存在則檔案長度清為0,即該檔案內容會消失。若檔案不存在則建立該檔案。
w+ 開啟可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案內容會消失。若檔案不存在則建立該檔案。
a 以附加的方式開啟只寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的內容會被保留。(EOF符保留)
a+ 以附加方式開啟可讀寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾後,即檔案原先的內容會被保留。 (原來的EOF符不保留)
wb 只寫開啟或新建一個二進位制檔案;只允許寫資料。
wb+ 讀寫開啟或建立一個二進位制檔案,允許讀和寫。
ab+ 讀寫開啟一個二進位制檔案,允許讀或在檔案末追加資料。
at+ 開啟一個叫string的檔案,a表示append,就是說寫入處理的時候是接著原來檔案已有內容寫入,不是從頭寫入覆蓋掉,t表示開啟檔案的型別是文字檔案,+號表示對檔案既可以讀也可以寫。
上述的形態字串都可以再加一個b字元,如rb、w+b或ab+等組合,加入b 字元用來告訴函式庫以二進位制模式開啟檔案。如果不加b,表示預設加了t,即rt,wt,其中t表示以文字模式開啟檔案。由fopen()所建立的新檔案會具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)許可權,此檔案許可權也會參考umask 值。
有些C編譯系統可能不完全提供所有這些功能,有的C版本不用"r+","w+","a+",而用"rw","wr","ar"等,讀者注意所用系統的規定。
 

2.  open    

  • 開啟裝置檔案
  • 不帶緩衝區
  • 非緩衝檔案系統依賴於作業系統,通過作業系統的功能對檔案進行讀寫,是系統級的輸入輸出,它不設檔案結構體指標,只能讀寫二進位制檔案,但效率高、速度 快
 
函式原型:int open(const char *pathname, int flags);
                int open(const char *pathname, int flags, mode_t mode);
 
所需庫:<fcntl.h>
返回值:成功則返回檔案描述符,否則返回 -1;
引數說明:
對於open函式來說,第三個引數僅當建立新檔案時(即 使用了O_CREAT 時)才使用,用於指定檔案的訪問許可權位(access permission bits)。pathname 是待開啟/建立檔案的POSIX路徑名(如/home/user/a.cpp);flags 用於指定檔案的開啟/建立模式,這個引數可由以下常量(定義於fcntl.h)通過邏輯位或邏輯構成。
  1. O_RDONLY 只讀模式
  2. O_WRONLY 只寫模式
  3. O_RDWR 讀寫模式
開啟/建立檔案時,至少得使用上述三個常量中的一個。以下常量是選用的:
  • O_APPEND 每次寫操作都寫入檔案的末尾
  • O_CREAT 如果指定檔案不存在,則建立這個檔案
  • O_EXCL 如果要建立的檔案已存在,則返回 -1,並且修改 errno 的值
  • O_TRUNC 如果檔案存在,並且以只寫/讀寫方式開啟,則清空檔案全部內容(即將其長度截短為0)
  • O_NOCTTY 如果路徑名指向終端裝置,不要把這個裝置用作控制終端。
  • O_NONBLOCK 如果路徑名指向 FIFO/塊檔案/字元檔案,則把檔案的開啟和後繼 I/O
設定為非阻塞模式
  • (nonblocking mode)
以下三個常量同樣是選用的,它們用於同步輸入輸出
  • O_DSYNC 等待物理 I/O 結束後再 write。在不影響讀取新寫入的資料的前提下,不等待檔案屬性更新。
  • O_RSYNCread等待所有寫入同一區域的寫操作完成後再進行
  • O_SYNC 等待物理 I/O 結束後再write,包括更新檔案屬性的 I/O
 

3.popen    

  • 開啟管道
函式原型:FILE * popen ( const char * command , const char * type );
所需庫:<stdio.h>
返回值:如果呼叫 fork() 或 pipe() 失敗,或者不能分配記憶體將返回NULL,否則返回標準 I/O 流。
引數說明:type 引數只能是讀或者寫中的一種,得到的返回值(標準 I/O 流)也具有和 type 相應的只讀或只寫型別。如果 type 是 "r" 則檔案指標連線到 command 的標準輸出;如果 type 是 "w" 則檔案指標連線到 command 的標準輸入。
command 引數是一個指向以 NULL 結束的 shell 命令字串的指標。這行命令將被傳到 bin/sh 並使用-c 標誌,shell 將執行這個命令。

相關文章