C語言
函式簡介
函式原型:FILE * fopen(const char * path, const char * mode);
返回值:檔案順利打開後,指向該流的檔案指針就會被返回。如果檔案打開失敗則返回 NULL,並把錯誤代碼存在error中。
一般而言,打開檔案後會做一些檔案讀取或寫入的動作,若打開檔案失敗,接下來的讀寫動作也無法順利進行,所以一般在 fopen() 後作錯誤判斷及處理。
參數說明:
參數 path字元串包含欲打開的檔案路徑及檔案名稱,參數 mode 字元串則代表著流形態。
mode 有下列幾種形態字元串:
字元串 | 說明 |
r | 以唯讀方式打開檔案,該檔案必須存在。 |
r+ | 以讀/寫方式打開檔案,該檔案必須存在。 |
rb+ | 以讀/寫方式打開一個二進制檔案,只允許讀/寫數據。 |
rt+ | 以讀/寫方式打開一個文本檔案,允許讀和寫。 |
w | 打開只寫檔案,若檔案存在則檔案長度清為零,即該檔案內容會消失;若檔案不存在則創建該檔案。 |
w+ | 打開可讀/寫檔案,若檔案存在則檔案長度清為零,即該檔案內容會消失;若檔案不存在則創建該檔案。 |
a | 以附加的方式打開只寫檔案。若檔案不存在,則會創建該檔案;如果檔案存在,則寫入的數據會被加到檔案尾後,即檔案原先的內容會被保留(EOF 符保留)。 |
a+ | 以附加方式打開可讀/寫的檔案。若檔案不存在,則會創建該檔案,如果檔案存在,則寫入的數據會被加到檔案尾後,即檔案原先的內容會被保留(EOF符不保留)。 |
wb | 以只寫方式打開或新建一個二進制檔案,只允許寫數據。 |
wb+ | 以讀/寫方式打開或新建一個二進制檔案,允許讀和寫。 |
wt+ | 以讀/寫方式打開或新建一個文本檔案,允許讀和寫。 |
at+ | 以讀/寫方式打開一個文本檔案,允許讀或在文本末追加數據。 |
ab+ | 以讀/寫方式打開一個二進制檔案,允許讀或在檔案末追加數據。 |
以 x 結尾的模式為獨占模式,檔案已存在或者無法創建(一般是路徑不正確)都會導致 fopen 失敗。檔案以作業系統支持的獨占模式打開。
上述的形態字元串都可以再加一個 b 字元,如 rb、w+b 或 ab+ 等組合,加入 b 字元用來告訴函式館以二進制模式打開檔案。如果不加 b,表示默認加了 t,即 rt、wt,其中 t 表示以文本模式打開檔案。由 fopen() 所建立的新檔案會具有 S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666) 許可權,此檔案許可權也會參考umask值。
有些 C編譯系統可能不完全提供所有這些功能,有的C版本不用"r+"、"w+"、"a+",而用"rw"、"wr"、"ar"等,讀者注意所用系統的規定。
二進制 和文本模式的區別
1、在Windows系統中,文本模式下,檔案以"\r\n"代表換行。若以文本模式打開檔案,並用 fputs 等函式寫入換行符"\n"時,函式會自動在"\n"前面加上"\r"。即實際寫入檔案的是"\r\n"。
2、在類 Unix/Linux 系統中文本模式下,檔案以"\n"代表換行。所以 Linux 系統中在文本模式和二進制模式下並無區別。
打開方式總結:各種打開方式主要有三個方面的區別
1、打開是否為二進制檔案,用“b”標識。
2、讀寫的方式,有以下幾種:唯讀、只寫、讀寫、追加只寫、追加讀寫這幾種方式。
3、對檔案是否必 須存在、以及存在時是清空還是追加會有不同的回響。具體判斷如下圖。
程式示例
示例一
示例二
注意!初學者往往會犯一個錯誤,即在輸入檔案名稱時不加後綴名,請注意加上!
示例三
示例四
Linux 下的程式示例。
在 / opt / C_lanuage / fopen_fread 新建兩個文本,main.c 和 tmp.txt
tmp.txt:
I Love You Linux----Red Hat Enterprise----夢劇場的記憶
main.c 程式:
編譯加執行
[root@localhost fopen_fread]# gcc - g main.c - o main
[root@localhost fopen_fread]# . / main
I Love You Linux----Red Hat Enterprise----夢劇場的記憶
注意
在檔案操作時,需要注意以下幾點問題:
1、在定義檔案指針時,要將檔案指針指向空;如 FILE *fp = NULL;
2、在檔案操作完成後,需要將檔案關閉,一定要注意,否則會造成檔案所占用記憶體泄漏和在下次訪問檔案時出現問題。
3、檔案關閉後,需要將檔案指針指向空,這樣做會防止出現游離指針,而對整個工程造成不必要的麻煩;如:fp = NULL;
在PHP中
說明
resource fopen ( string filename, string mode, [ bool use_include_path, [resource zcontext]] )
fopen() 將 filename 指定的名字資源綁定到一個流上。如果 filename 是 "scheme://..." 的格式,則被當成一個 URL,PHP 將搜尋協定處理器(也被稱為封裝協定)來處理此模式。如果該協定尚未註冊封裝協定,PHP 將發出一條訊息來幫助檢查腳本中潛在的問題並將 filename 當成一個普通的檔案名稱繼續執行下去。
如果 PHP 認為 filename 指定的是一個本地檔案,將嘗試在該檔案上打開一個流。該檔案必須是 PHP 可以訪問的,因此需要確認檔案訪問許可權允許該訪問。如果激活了 安全模式 或者 open_basedir 則會套用進一步的限制。
例子
MATLAB函式
在matlab中,fopen也是一個打開檔案的函式。在matlab的命令視窗中輸入doc fopen或者help fopen就可以獲得該函式的幫助信息。
調用格式
fileID = fopen( filename)
fileID = fopen( filename, permission)
fileID = fopen( filename, permission, machineformat)
fileID = fopen( filename, permission, machineformat, encoding)
[ fileID, message]= fopen( filename, ...)
fIDs = fopen('all')
[ filename, permission, machineformat, encoding]= fopen( fileID)
各種調用格式詳情請參閱MATLAB幫助文檔。
程式示例
程式首先向檔案寫入字元串,然後通過type列印在螢幕上。
這裡需要注意的是,如果字元串內有單撇號(')要用兩個單撇號表示一個單撇號。
在Oracle中
Oracle提供的檔案操作包UTL_FILE包中的UTL_FILE.FOPEN負責打開一個檔案。
UTL_FILE.FOPEN(location in varchar2, filename in varchar2, open_mode in varchar2) return FILE_TYPE;
Location 是路徑參數,
FILENAME 是檔案名稱,
OPEN_MODE是打開模式,'R'是讀文本,'W'是寫文本,'A'是附加文本,參數不分大小寫,如果指定'A'但是檔案不存在,它會用'W'先創建出來,'W'有覆蓋的功能;
其中的location並不能簡單的指定為'D:\temp'等路徑,要建立一個DIRECTORY變數並付給許可權(必須以DBA身份登錄):
create or replace directory D_OUTPUT as 'D:\TEMP';
grant read,write on directory D_OUTPUT to testdb;
GRANT EXECUTE ON utl_file TO testdb;
之後就可以用UTL_FILE包建立檔案了 :
V_FILE UTL_FILE.FILE_TYPE;
V_FILE := UTL_FILE.FOPEN('D_OUTPUT', 'Data.txt', 'w');