fopen

fopen

函式原型:FILE * fopen(const char * path, const char * mode);

相關函式:open, fclose, fopen_s, _wfopen

返回值:檔案順利打開後,指向該流的檔案指針就會被返回。如果檔案打開失敗則返回 NULL,並把錯誤代碼存在 error 中。

基本介紹

  • 中文名:檔案打開
  • 外文名:fopen
  • 函式功能:打開一個檔案
  • 頭檔案:#include <stdio.h>
C語言,函式簡介,程式示例,注意,在PHP中,說明,例子,MATLAB函式,

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、對檔案是否必 須存在、以及存在時是清空還是追加會有不同的回響。具體判斷如下圖。

程式示例

示例一
#include <stdio.h>#define F_PATH "d:\\myfile\\file.dat"int main(void){    FILE *fp = NULL; /* 需要注意 */    fp = fopen(F_PATH, "r");    if (NULL == fp)    {        return -1; /* 要返回錯誤代碼 */    }    fclose(fp);    fp = NULL; /* 需要指向空,否則會指向原打開檔案地址 */    return 0;}
示例二
#include <stdio.h>#include <stdlib.h> /* 為了使用exit() */int main(void){    int i = 0; /* 用於 putchar & getc 的數據接收 */    char *ch = "";    FILE *fp = NULL;    char fname[50]; /* 用於存放檔案名稱 */    printf("輸入檔案名稱:");    scanf("%s", fname);    fp = fopen(fname, "r"); /* 只供讀取 */    if (NULL == fp) /* 如果失敗了 */    {        printf("錯誤!");        exit(1); /* 中止程式 */    }    while ((ch[i] = getc(fp)) != EOF)    {        putchar(ch[i]);        i ++;    }    fclose(fp); /* 關閉檔案 */    fp = NULL; /* 需要指向空,否則會指向原打開檔案地址 */    return 0;}
注意!初學者往往會犯一個錯誤,即在輸入檔案名稱時不加後綴名,請注意加上!
示例三
#include <stdio.h>FILE *stream, *stream2;int main(void){    int numclosed; /* Open for read (will fail if file "crt_fopen.c" does not exist) */    if ((stream = fopen("crt_fopen.c", "r")) == NULL) /* C4996 */        //Note: fopen is deprecated; consider using fopen_s instead        printf("The file `crt_fopen.c' was not opened\n");    else        printf("The file `crt_fopen.c' was opened\n"); /* Open for write */    if ((stream2 = fopen("data2", "w+")) == NULL) /* C4996 */        printf("The file `data2' was not opened\n");    else        printf("The file `data2' was opened\n");    /* Closes tream if it is not NULL */    if (stream)    {        if (fclose(stream))        {            printf("The file `crt_fopen.c' was not closed\n");        }    }    /* All other files are closed: */    numclosed = _fcloseall();    printf("Number of files closed by _fcloseall: %u\n", numclosed);}
示例四
Linux 下的程式示例。
在 / opt / C_lanuage / fopen_fread 新建兩個文本,main.c 和 tmp.txt
tmp.txt:
I Love You Linux----Red Hat Enterprise----夢劇場的記憶
main.c 程式:
#include <stdio.h>int main(void){    FILE *fp = NULL;    char tmp[100];    fp = fopen("/opt/C_lanuage/fopen_fread/tmp.txt", "r");    if (NULL == fp)    {        printf("File open fail!\n");        return -1;    }    fread(tmp, 1, 100, fp);    printf("%s\n", tmp);    fclose(fp);    fp = NULL;    return 0;}
編譯加執行
[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 則會套用進一步的限制。

例子

<?php$handle=fopen("/home/rasmus/file.txt","r");$handle=fopen("/home/rasmus/file.gif","wb");?>

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幫助文檔。
程式示例
% MATLAB: fopen()函式的使用clcfileID = fopen('Test.txt', 'w');if fileID == -1disp('fopen failed.');return;elsedisp('fopen succeed.');endStr = 'It is just a test. By mayadong7349';fprintf(fileID, '%s', Str);% Caution:disp('Now, I''d like to type the file.');type('Test.txt');fclose(fileID);
程式首先向檔案寫入字元串,然後通過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');

熱門詞條

聯絡我們