1,fread是帶緩衝的,read不帶緩衝.
2,fopen是標準c裡定義的,open是POSIX中定義的.
3,fread可以讀一個結構.read在linux/unix中讀二進位與普通檔案沒有區別.
4,fopen不能指定要建立檔案的許可權.open可以指定許可權.
5,fopen返回指標,open返迴文件描述符(整數).
6,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做真正的寫入檔案系統工作),但是這其中的差別無所謂。
============ read/write 系統調用 read 函數從開啟的裝置或檔案中讀取資料。
#include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 傳回值:成功返回讀取的位元組數,出錯返回-1並設定errno,如果在調read之前已到達檔案末尾,則這次read返回0
參數 count 是請求讀取的位元組數,讀上來的資料儲存在緩衝區 buf 中,同時檔案的當前讀寫位置向後移。注意這個讀寫位置和使用C標準I/O庫時的讀寫位置有可能不同,這個讀寫位置是記在核心中的,而使用C標準I/O庫時的讀寫位置是使用者空間I/O緩衝區中的位置。
fread就是通過read來實現的,fread是C語言的庫,而read是系統調用
但是差別在read每次讀的資料是調用者要求的大小,比如調用要求讀取10個位元組資料,read就會讀10個位元組資料到數組中,而fread不一樣,為了加快讀的速度,fread每次都會讀比要求更多的資料,然後放到緩衝區中,這樣下次再讀資料只需要到緩衝區中去取就可以了。
fread每次會讀取一個緩衝區大小的資料,32位下一般是4096個位元組,相當於調用了read(fd,buf,4096)
比如需要讀取512個位元組資料,分4次讀取,調用read就是:
for(i=0; i<4; ++i)
read(fd,buf,128)
一共有4次系統調用
而fread一次就讀取了4096位元組放到緩衝區了,所以省事了
比如用 fgetc 讀一個位元組, fgetc 有可能從核心中預讀1024個位元組到I/O緩衝區中,再返回第一個位元組,這時該檔案在核心中記錄的讀寫位置是1024,而在 FILE 結構體中記錄的讀寫位置是1。注意傳回值類型是 ssize_t ,表示有符號的 size_t ,這樣既可以返回正的位元組數、0(表示到達檔案末尾)也可以返回負值-1(表示出錯)。 read 函數返回時,傳回值說明了 buf 中前多少個位元組是剛讀上來的。有些情況下,實際讀到的位元組數(傳回值)會小於請求讀的位元組數 count ,例如: 讀常規檔案時,在讀到count個位元組之前已到達檔案末尾。例如,距檔案末尾還有30個位元組而請求讀100個位元組,則read返回30,下次read將返回0。
從終端裝置讀,通常以行為單位,讀到分行符號就返回了。
從網路讀,根據不同的傳輸層協議和核心緩衝機制,傳回值可能小於請求的位元組數,後面socket編程部分會詳細講解。