轉自:http://blog.csdn.net/xiaofei0859/article/details/51145051
二者都是對文件進行操作,那么二者有什么區別,用的時候該如何選擇呢?
1. 區別
- fread是帶緩沖的,read不帶緩沖.
- fopen是標准c里定義的,open是POSIX中定義的.
- fread可以讀一個結構.read在Linux/unix中讀二進制與普通文件沒有區別.
- fopen不能指定要創建文件的權限.open可以指定權限.
- fopen返回指針,open返回文件描述符(整數).
- linux/unix中任何設備都是文件,都可以用open,read.
如果文件的大小是8k。
你如果用read/write,且只分配了2k的緩存,則要將此文件讀出需要做4次系統調用來實際從磁盤上讀出。
如果你用fread/fwrite,則系統自動分配緩存,則讀出此文件只要一次系統調用從磁盤上讀出。
也就是用read/write要讀4次磁盤,而用fread/fwrite則只要讀1次磁盤。效率比read/write要高4倍。
如果程序對內存有限制,則用read/write比較好。
都用fread 和fwrite,它自動分配緩存,速度會很快,比自己來做要簡單。如果要處理一些特殊的描述符,用read 和write,如套接口,管道之類的
系統調用write的效率取決於你buf的大小和你要寫入的總數量,如果buf太小,你進入內核空間的次數大增,效率就低下。而fwrite會替你做緩存,減少了實際出現的系統調用,所以效率比較高。
如果只調用一次(可能嗎?),這倆差不多,嚴格來說write要快一點點(因為實際上fwrite最后還是用了write做真正的寫入文件系統工作),但是這其中的差別無所謂。
2.來自論壇的解釋
fread帶緩存指的是應用層帶緩存,read也是帶了緩存但是指的是系統層或者說kernel層,當然也可能不帶,比如直接DMA,由驅動決定。
fread是標准庫的緩沖,read是內核的緩沖。
read/write如果可以精確控制一次讀寫的數據,則會比fread/fwrite更加高效
read/write對應Linux中的system call, 而fread/fwrite則可以說是對read/write的又一次封裝,read/write更加原生,如果不考慮跨平台,建議多使用read/write.
舉個例子:
做如下步驟的操作:
- 打開文件
- 讀文件的0k~4k(read or fread)
- 其他操作
- 讀文件的1k~3k(read or fread)
- 關閉文件
這時候如果是read,步驟4要調用內核;而如果是fread,因步驟2在應用層已經緩沖所需內容,數據會直接返回,無需再次調用內核