fopen /open區別
UNIX環境下的C 對二進位流檔案的讀寫有兩套班子:1) fopen,fread,fwrite ; 2) open, read, write
這裡簡單的介紹一下他們的區別。
1. fopen 系列是標準的C庫函數;open系列是 POSIX 定義的,是UNIX系統裡的system call。
也就是說,fopen系列更具有可移植性;而open系列只能用在 POSIX 的作業系統上。
2. 使用fopen 系列函數時要定義一個指代檔案的對象,被稱為“檔案控制代碼”(file handler),是一個結構體;而open系列使用的是一個被稱為“檔案描述符” (file descriptor)的int型整數。
3. fopen 系列是層級較高的I/O,讀寫時使用緩衝;而open系列相對低層,更接近作業系統,讀寫時沒有緩衝。由於能更多地與作業系統打交道,open系列可以訪問更改一些fopen系列無法訪問的資訊,如查看檔案的讀寫權限。這些額外的功能通常因系統而異。
4. 使用fopen系列函數需要"#include <sdtio.h>";使用open系列函數需要"#include <fcntl.h>" ,連結時要之用libc(-lc)
小結:
總的來說,為了使程式獲得更好的可移植性,未到非得使用一些fopen系列無法實現的功能的情況下,fopen系列是首選。
read/write和fread/fwrite區別
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做真正的寫入檔案系統工作),但是這其中的差別無所謂。
——————————————————
表標頭檔
#include<stdio.h>
定義函數
FILE * fopen(const char * path,const char * mode);
函數說明
參數path字串包含欲開啟的檔案路徑及檔案名稱,參數mode字串則代表著流形態。
mode有下列幾種形態字串:
r 開啟唯讀檔案,該檔案必須存在。
r+ 開啟可讀寫的檔案,該檔案必須存在。
w 開啟唯寫檔案,若檔案存在則檔案長度清為0,即該檔案內容會消失。若檔案不存在則建立該檔案。
w+ 開啟可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案內容會消失。若檔案不存在則建立該檔案。
a 以附加的方式開啟唯寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的內容會被保留。
a+ 以附加方式開啟可讀寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾後,即檔案原先的內容會被保留。
上述的形態字串都可以再加一個b字元,如rb、w+b或ab+等組合,加入b 字元用來告訴函數庫開啟的檔案為二進位檔案,而非純文字檔案。不過在POSIX系統,包含Linux都會忽略該字元。由fopen()所建立的新檔案會具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)許可權,此檔案許可權也會參考umask值。
傳回值
檔案順利開啟後,指向該流的檔案指標就會被返回。若果檔案開啟失敗則返回NULL,並把錯誤碼存在errno 中。
附加說明
一般而言,開檔案後會作一些檔案讀取或寫入的動作,若開檔案失敗,接下來的讀寫動作也無法順利進行,所以在fopen()後請作錯誤判斷及處理。
表標頭檔
#include<stdio.h>
定義函數
int fclose(FILE * stream);
函數說明
fclose()用來關閉先前fopen()開啟的檔案。此動作會讓緩衝區內的資料寫入檔案中,並釋放系統所提供的檔案資源。
傳回值
若關檔案動作成功則返回0,有錯誤發生時則返回EOF並把錯誤碼存到errno。
錯誤碼
EBADF表示參數stream非已開啟的檔案。
fread(從檔案流讀取資料)
相關函數
fopen,fwrite,fseek,fscanf
表標頭檔
#include<stdio.h>
定義函數
size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);
函數說明
fread()用來從檔案流中讀取資料。參數stream為已開啟的檔案指標,參數ptr 指向欲存放讀取進來的資料空間,讀取的字元數以參數size*nmemb來決定。Fread()會返回實際讀取到的nmemb數目,如果此值比參數nmemb 來得小,則代表可能讀到了檔案尾或有錯誤發生,這時必須用feof()或ferror()來決定發生什麼情況。
傳回值
返回實際讀取到的nmemb數目。
fwrite(將資料寫至檔案流)
相關函數
fopen,fread,fseek,fscanf
表標頭檔
#include<stdio.h>
定義函數
size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);
函數說明
fwrite()用來將資料寫入檔案流中。參數stream為已開啟的檔案指標,參數ptr 指向欲寫入的資料地址,總共寫入的字元數以參數size*nmemb來決定。Fwrite()會返回實際寫入的nmemb數目。
傳回值
返回實際寫入的nmemb數目。
原文出處:http://blog.csdn.net/fuyjlu/article/details/5508421