對於這兩個名字很類似的函式,對於很多初學者來說,不容易搞清楚它們有什麼不同,只知道按照函式用法使用。
如果能很好的區分兩者,相信大家對於c語言和unix系統(包括linux)有更深入的了解。
在網上查詢了一些資料,但是感覺不夠全面,一些答案只是從某個角度闡述,所以讓人覺得,這個也對,那個也對。
但到底誰的表述更正確呢?其實都是對的,只是解釋的視角不同罷了。
1、 **從**的角度看,兩者能很好的區分開,這也是兩者最顯而易見的區別:open是unix系統呼叫函式(包括linux等),返回的是檔案描述符(file descriptor),它是檔案在檔案描述符表裡的索引。fopen是ansic標準中的c語言庫函式,在不同的系統中應該呼叫不同的核心api。返回的是乙個指向檔案結構的指標。
ps:從**來看,兩者是有千絲萬縷的聯絡的,畢竟c語言的庫函式還是需要呼叫系統api實現的。
2、移植性這一點從上面的**就可以推斷出來,fopen
是c標準函式,因此擁有良好的移植性;而open
是unix系統呼叫,
移植性有限。如windows下相似的功能使用api函式createfile
。
3、適用範圍open返回檔案描述符,而檔案描述符是unix系統下的乙個重要概念,unix下的一切裝置都是以檔案的形式操作。如網路套接字、硬體裝置等。當然包括操作普通正規檔案(regular file)。fopen是用來操縱普通正規檔案(regular file)的。
4、 檔案io層次如果從檔案io的角度來看,前者屬於低階io函式,後者屬於高階io函式。低階和高階的簡單區分標準是:誰離系統核心更近。
低階檔案io執行在核心態,高階檔案io執行在使用者態。
5、緩衝緩衝檔案系統
緩衝檔案系統的特點是:在記憶體開闢乙個「緩衝區」,為程式中的每乙個檔案使用;當執行讀檔案的操作時,
從磁碟檔案將資料先讀入記憶體「緩衝區」,裝滿後再從記憶體「緩衝區」依此讀出需要的資料。執行寫檔案的操作時,
先將資料寫入記憶體「緩衝區」,待記憶體「緩衝區」裝滿後再寫入檔案。由此可以看出,記憶體「緩衝區」的大小,影響著實際操作外存的次數,
記憶體「緩衝區」越大,則操作外存的次數就少,執行速度就快、效率高。一般來說,檔案「緩衝區」的大小隨機器 而定。
fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等。非緩衝檔案系統
緩衝檔案系統是借助檔案結構體指標來對檔案進行管理,通過檔案指標來對檔案進行訪問,既可以讀寫字元、字串、格式化資料,
也可以讀寫二進位制資料。非緩衝檔案系統依賴於作業系統,通過作業系統的功能對檔案進行讀寫,是系統級的輸入輸出,
它不設檔案結構體指標,只能讀寫二進位制檔案,但效率高、速度快,由於ansi標準不再包括非緩衝檔案系統,
因此建議大家最好不要選擇它。open, close, read, write, getc, getchar, putc, putchar等。
一句話總結一下,就是open無緩衝,fopen有緩衝。前者與read, write等配合使用, 後者與fread,fwrite等配合使用。
使用fopen函式,由於在使用者態下就有了緩衝,因此進行檔案讀寫操作的時候就減少了使用者態和核心態的切換
(切換到核心態呼叫還是需要呼叫系統呼叫api:read,write);而使用open函式,在檔案讀寫時則每次都需要進行核心態和使用者態的切換;表現為,如果順序訪問檔案,
fopen系列的函式要比直接呼叫open系列的函式快;如果隨機訪問檔案則相反。
這樣一總結梳理,相信大家對於兩個函式及系列函式有了乙個更全面清晰的認識,也應該知道在什麼場合下使用什麼樣的函式更合適,效率更高。
備註:
fopen與open的區別
open和fopen的區別 1.緩衝檔案系統 緩衝檔案系統的特點是 在記憶體開闢乙個 緩衝區 為程式中的每乙個檔案使用,當執行讀檔案的操作時,從磁碟檔案將資料先讀入記憶體 緩衝區 裝滿後再從記憶體 緩衝區 依此讀入接收的變數。執行寫檔案的操作時,先將資料寫入記憶體 緩衝區 待記憶體 緩衝區 裝滿後再...
fopen與open的區別
fopen與open的區別 可以參考 4.6,比較詳細的講解了fopen,open,檔案描述符,檔案指標,以及在父程序與子程序的不同.摘自chinaunix open和fopen的區別 前者屬於低階io,後者是高階io。前者返回乙個檔案描述符 使用者程式區的 後者返回乙個檔案指標。前者無緩衝,後者有...
fopen與open的區別
2011 02 25 14 40 23 分類 c 字型大小訂閱 相同點 都是用來完成檔案開啟操作的函式 不同點 open是系統呼叫,返回的是檔案控制代碼,fopen是庫函式,返回的是乙個指向檔案結構的指標 open與 read,write等配合使用,fopen與 fread,fwrite等配合使用 ...