fopen()函數的用法


函數功能:打開一個文件

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

相關函數:open,fclosefopen_s,_wfopen

fopen所需庫:<stdio.h>

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

一般而言,打開文件后會作一些文件讀取或寫入的動作,若打開文件失敗,接下來的讀寫動作也無法順利進行,所以一般在fopen()后作錯誤判斷及處理。

參數說明:

參數path字符串包含欲打開的文件路徑及文件名,參數mode字符串則代表着流形態。

mode有下列幾種形態字符串:

r 以只讀方式打開文件,該文件必須存在。

r+ 以可讀寫方式打開文件,該文件必須存在。

rb+ 讀寫打開一個二進制文件,允許讀寫數據。

rw+ 讀寫打開一個文本文件,允許讀和寫。

w 打開只寫文件,若文件存在則文件長度清為0,即該文件內容會消失。若文件不存在則建立該文件。

w+ 打開可讀寫文件,若文件存在則文件長度清為零,即該文件內容會消失。若文件不存在則建立該文件。

a 以附加的方式打開只寫文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾,即文件原先的內容會被保留。(EOF符保留)

a+ 以附加方式打開可讀寫的文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾后,即文件原先的內容會被保留。 (原來的EOF符不保留)

wb 只寫打開或新建一個二進制文件;只允許寫數據。

wb+ 讀寫打開或建立一個二進制文件,允許讀和寫。

ab+ 讀寫打開一個二進制文件,允許讀或在文件末追加數據。

at+ 打開一個叫string的文件,a表示append,就是說寫入處理的時候是接着原來文件已有內容寫入,不是從頭寫入覆蓋掉,t表示打開文件的類型是文本文件,+號表示對文件既可以讀也可以寫。

上述的形態字符串都可以再加一個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系統中,文本模式下,文件以""代表換行。若以文本模式打開文件,並用fputs等函數寫入換行符"\n"時,函數會自動在"\n"前面加上"\r"。即實際寫入文件的是"" 。

2.在類Unix/Linux系統中文本模式下,文件以"\n"代表換行。所以Linux系統中在文本模式和二進制模式下並無區別。

示例

程序示例1

#include <stdio.h>

#include //為了使用 exit()

int main()

{

char ch;

FILE* fp;

char fname[50]; //用於存放文件名

printf("輸入文件名:");

scanf("%s",fname);

fp=fopen(fname,"r"); //只供讀取

if(fp==NULL) //如果失敗了

{

printf("錯誤!");

exit(1); //中止程序

}

//getc()用於在打開文件中獲取一個字符

while((ch=getc(fp))!=EOF)

putchar(ch);

fclose(fp); //關閉文件

return 0;

}

注意!初學者往往會犯一個錯誤,即在輸入文件名時不加后綴名,請注意加上!

程序示例2

#include <stdio.h>

FILE *stream, *stream2;

int main( void )

{

int numclosed;

fopen// Open for read (will fail if file "crt_fopen.c" does not exist)

if( (stream = fopen( "crt_fopen.c", "r" )) == NULL ) // C4996

// Note: fopenis deprecated; consider usingfopen_sinstead

printf( "The file 'crt_fopen.c' was notopened\n" );

else

printf( "The file 'crt_fopen.c' wasopened\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" );

// Close stream 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 );

}

<:SECTION>

2 操作

[1]在文件操作時,需要注意以下幾點問題

1、在定義文件指針時,要將文件指針指向空;如 FILE *fp = NULL;

2、文件操作完成后,需要將文件關閉,一定要注意,否則會造成文件所占用內存泄露和在下次訪問文件時出現問題。

3、文件關閉后,需要將文件指針指向空,這樣做會防止出現游離指針,而對整個工程造成不必要的麻煩;如:fp = NULL;

示例程序:

#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;

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM