函式原型:
int open( const char * pathname, int flags);
int open( const char * pathname,int flags, mode_t mode);
作用:以各種方式開啟檔案
返回值:返回開啟的檔案控制代碼,-1 開啟失敗
函式說明引數pathname 指向欲開啟的檔案路徑字串,
既可以是相對路徑也可以是絕對路徑。flags
引數有一系列常數值可供選擇,可以同時選擇多個常數用按位或運算子連線起來,所以這些常數的巨集定義都以o_
開頭,表示or
下列是引數flags 所能使用的旗標:
必選項:以下三個常數中必須指定乙個,且僅允許指定乙個。
o_rdonly 以唯讀方式開啟檔案
o_wronly 以只寫方式開啟檔案
o_rdwr 以可讀寫方式開啟檔案。上述三種旗標是互斥的,也就是不可同時使用,但可與下列的旗標利用or(|)運算子組合。
以下可選項可以同時指定0個或多個,和必選項按位或起來作為flags
引數。
o_creat 若欲開啟的檔案不存在則自動建立該檔案。
o_excl 如果o_creat 也被設定,此指令會去檢查檔案是否存在。檔案若不存在則建立該檔案,否則將導致開啟檔案錯誤。此外,若o_creat與o_excl 同時設定,並且欲開啟的檔案為符號連線,則會開啟檔案失敗。
o_noctty
如果欲開啟的檔案為終端機裝置時,則不會將該終端機當成程序控制終端機。
o_trunc
若檔案存在並且以可寫的方式開啟時,此旗標會令檔案長度清為
0,而原來存於該檔案的資料也會消失。
當讀寫檔案時會從檔案尾開始移動,也就是所寫入的資料會以附加的方式加入到檔案後面。
o_nonblock
以不可阻斷的方式開啟檔案,也就是無論有無資料讀取或等待,都會立即返回程序之中。
o_ndelay
同o_nonblock。
o_sync
以同步的方式開啟檔案。
o_nofollow
如果引數
pathname
所指的檔案為一符號連線,則會令開啟檔案失敗。
o_directory
如果引數
pathname
所指的檔案並非為一目錄,則會令開啟檔案失敗。
此為linux2.2以後特有的旗標,以避免一些系統安全問題。
第三個引數mode
指定檔案許可權,可以用八進位制數表示,比如0644表示-rw-r--r--
,也可以用s_irusr
、s_iwusr
等巨集定義按位或起來表示,引數mode 則有下列數種組合,只有在建立新檔案時才會生效,檔案許可權由open
的mode
引數和當前程序的umask
掩碼共同決定,因此該檔案許可權應該為(mode-umaks)。
s_irwxu 00700 許可權,代表該檔案所有者具有可讀、可寫及可執行的許可權。
s_irusr 或s_iread,00400許可權,代表該檔案所有者具有可讀取的許可權。
s_iwusr 或s_iwrite,00200 許可權,代表該檔案所有者具有可寫入的許可權。
s_ixusr 或s_iexec,00100 許可權,代表該檔案所有者具有可執行的許可權。
s_irwxg 00070許可權,代表該檔案使用者組具有可讀、可寫及可執行的許可權。
s_irgrp 00040 許可權,代表該檔案使用者組具有可讀的許可權。
s_iwgrp 00020許可權,代表該檔案使用者組具有可寫入的許可權。
s_ixgrp 00010 許可權,代表該檔案使用者組具有可執行的許可權。
s_irwxo 00007許可權,代表其他使用者具有可讀、可寫及可執行的許可權。
s_iroth 00004 許可權,代表其他使用者具有可讀的許可權
s_iwoth 00002許可權,代表其他使用者具有可寫入的許可權。
s_ixoth 00001 許可權,代表其他使用者具有可執行的許可權。
返回值若所有欲核查的許可權都通過了檢查則返回0 值,表示成功,只要有乙個許可權被禁止則返回-1。
錯誤**eexist 引數pathname 所指的檔案已存在,卻使用了o_creat和o_excl旗標。
eaccess 引數pathname所指的檔案不符合所要求測試的許可權。
erofs 欲測試寫入許可權的檔案存在於唯讀檔案系統內。
efault 引數pathname指標超出可訪問記憶體空間。
einval 引數mode 不正確。
enametoolong 引數pathname太長。
enotdir 引數pathname不是目錄。
enomem 核心記憶體不足。
eloop 引數pathname有過多符號連線問題。
eio i/o 訪問錯誤。
fopen(開啟檔案)
相關函式 fopen,fclose
表頭檔案 #include
定義函式 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 中。
linux 中 open和fopen的區別
open和fopen的區別 主要區別是涉及到系統,而不是緩衝。帶f的是標準io,可以移植。不帶f只能在unix linux系統呼叫。open乙個是整數,fopen乙個是指標 file 二者區別大致可以總結為以下幾點 1,fread是帶緩衝的,read不帶緩衝.2,fopen是標準c裡定義的,open...
linux 中 open和fopen的區別
open和fopen的區別 主要區別是涉及到系統,而不是緩衝。帶f的是標準io,可以移植。不帶f只能在unix linux系統呼叫。open乙個是整數,fopen乙個是指標 file 二者區別大致可以總結為以下幾點 1,fread是帶緩衝的,read不帶緩衝.2,fopen是標準c裡定義的,open...
C語言中open函式
簡述 include int open const char pathname,int oflag,mode t mode 返回值 成功則返回 檔案描述符 否則返回 1 對於 open 函式來說,第三個引數 僅當建立新檔案時 即 使用了o creat 時 才使用,用於指定檔案的訪問許可權位 acce...