fopen函数简介
函數(shù)簡(jiǎn)介
函數(shù)功能:打開(kāi)一個(gè)文件
函數(shù)原型:FILE * fopen(const char * path,const char * mode);
相關(guān)函數(shù):open,fclose,fopen_s[1],_wfopen
所需庫(kù):<stdio.h>
返回值:文件順利打開(kāi)后,指向該流的文件指針就會(huì)被返回。如果文件打開(kāi)失敗則返回NULL,并把錯(cuò)誤代碼存在errno 中。
一般而言,打開(kāi)文件后會(huì)做一些文件讀取或?qū)懭氲膭?dòng)作,若打開(kāi)文件失敗,接下來(lái)的讀寫(xiě)動(dòng)作也無(wú)法順利進(jìn)行,所以一般在fopen()后作錯(cuò)誤判斷及處理。
參數(shù)說(shuō)明:
參數(shù)path字符串包含欲打開(kāi)的文件路徑及文件名,參數(shù)mode字符串則代表著流形態(tài)。
mode有下列幾種形態(tài)字符串:
r 以只讀方式打開(kāi)文件,該文件必須存在。
r+ 以可讀寫(xiě)方式打開(kāi)文件,該文件必須存在。
rb+ 讀寫(xiě)打開(kāi)一個(gè)二進(jìn)制文件,允許讀寫(xiě)數(shù)據(jù),文件必須存在。
rw+ 讀寫(xiě)打開(kāi)一個(gè)文本文件,允許讀和寫(xiě)。
w 打開(kāi)只寫(xiě)文件,若文件存在則文件長(zhǎng)度清為0,即該文件內(nèi)容會(huì)消失。若文件不存在則建立該文件。
w+ 打開(kāi)可讀寫(xiě)文件,若文件存在則文件長(zhǎng)度清為零,即該文件內(nèi)容會(huì)消失。若文件不存在則建立該文件。
a 以附加的方式打開(kāi)只寫(xiě)文件。若文件不存在,則會(huì)建立該文件,如果文件存在,寫(xiě)入的數(shù)據(jù)會(huì)被加到文件尾,即文件原先的內(nèi)容會(huì)被保留。(EOF符保留)
a+ 以附加方式打開(kāi)可讀寫(xiě)的文件。若文件不存在,則會(huì)建立該文件,如果文件存在,寫(xiě)入的數(shù)據(jù)會(huì)被加到文件尾后,即文件原先的內(nèi)容會(huì)被保留。 (原來(lái)的EOF符不保留)
wb 只寫(xiě)打開(kāi)或新建一個(gè)二進(jìn)制文件;只允許寫(xiě)數(shù)據(jù)。
wb+ 讀寫(xiě)打開(kāi)或建立一個(gè)二進(jìn)制文件,允許讀和寫(xiě)。
ab+ 讀寫(xiě)打開(kāi)一個(gè)二進(jìn)制文件,允許讀或在文件末追加數(shù)據(jù)。
at+ 打開(kāi)一個(gè)叫string的文件,a表示append,就是說(shuō)寫(xiě)入處理的時(shí)候是接著原來(lái)文件已有內(nèi)容寫(xiě)入,不是從頭寫(xiě)入覆蓋掉,t表示打開(kāi)文件的類(lèi)型是文本文件,+號(hào)表示對(duì)文件既可以讀也可以寫(xiě)。
上述的形態(tài)字符串都可以再加一個(gè)b字符,如rb、w+b或ab+等組合,加入b 字符用來(lái)告訴函數(shù)庫(kù)以二進(jìn)制模式打開(kāi)文件。如果不加b,表示默認(rèn)加了t,即rt,wt,其中t表示以文本模式打開(kāi)文件。由fopen()所建立的新文件會(huì)具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)權(quán)限,此文件權(quán)限也會(huì)參考umask 值。
有些C編譯系統(tǒng)可能不完全提供所有這些功能,有的C版本不用"r+","w+","a+",而用"rw","wr","ar"等,讀者注意所用系統(tǒng)的規(guī)定。
二進(jìn)制和文本模式的區(qū)別
1.在windows系統(tǒng)中,文本模式下,文件以"\r\n"代表?yè)Q行。若以文本模式打開(kāi)文件,并用fputs等函數(shù)寫(xiě)入換行符"\n"時(shí),函數(shù)會(huì)自動(dòng)在"\n"前面加上"\r"。即實(shí)際寫(xiě)入文件的是"\r\n" 。
2.在類(lèi)Unix/Linux系統(tǒng)中文本模式下,文件以"\n"代表?yè)Q行。所以Linux系統(tǒng)中在文本模式和二進(jìn)制模式下并無(wú)區(qū)別。
打開(kāi)方式總結(jié):各種打開(kāi)方式主要有三個(gè)方面的區(qū)別:
①打開(kāi)是否為二進(jìn)制文件,用“b”標(biāo)識(shí)。
②讀寫(xiě)的方式,有以下幾種:只讀、只寫(xiě)、讀寫(xiě)、追加只寫(xiě)、追加讀寫(xiě)這幾種方式。
③對(duì)文件是否必須存在、以及存在時(shí)是清空還是追加會(huì)有不同的響應(yīng)。具體判斷如下圖。
程序示例
示例一
#include<stdio.h>
?
#defineF_PATH"d:\\myfile\\file.dat"
intmain(void)
{
FILE*fp=NULL;//需要注意
fp=fopen(F_PATH,"r");
if(NULL==fp)
{
return-1;//要返回錯(cuò)誤代碼
}
fclose(fp);
fp=NULL;//需要指向空,否則會(huì)指向原打開(kāi)文件地址
return0;
}
示例二
#include<stdio.h>
#include<stdlib.h>//為了使用exit()
intmain()
{
charch;
FILE*fp=NULL;
charfname[50];//用于存放文件名
printf("輸入文件名:");
scanf("%s",fname);
fp=fopen(fname,"r");//只供讀取
if(fp==NULL)//如果失敗了
{
printf("錯(cuò)誤!");
exit(1);//中止程序
}
while((ch=getc(fp))!=EOF)
putchar(ch);
fclose(fp);//關(guān)閉文件
return0;
}
注意!初學(xué)者往往會(huì)犯一個(gè)錯(cuò)誤,即在輸入文件名時(shí)不加后綴名,請(qǐng)注意加上!(為什么文件一定要有后綴名?)
示例三[2]
#include<stdio.h>
?
FILE*stream,*stream2;
?
intmain(void)
{
intnumclosed;
//Openforread(willfailiffile"crt_fopen.c"doesnotexist)
if((stream=fopen("crt_fopen.c","r"))==NULL)//C4996
//Note:fopenisdeprecated;considerusingfopen_sinstead
printf("Thefile'crt_fopen.c'wasnotopened\n");
else
printf("Thefile'crt_fopen.c'wasopened\n");
//Openforwrite
if((stream2=fopen("data2","w+"))==NULL)//C4996
printf("Thefile'data2'wasnotopened\n");
else
printf("Thefile'data2'wasopened\n");
//ClosestreamifitisnotNULL
if(stream)
{
if(fclose(stream))
{
printf("Thefile'crt_fopen.c'wasnotclosed\n");
}
}
//Allotherfilesareclosed:
numclosed=_fcloseall();
printf("Numberoffilesclosedby_fcloseall:%u\n",numclosed);
}
注意
在文件操作時(shí),需要注意以下幾點(diǎn)問(wèn)題
1、在定義文件指針時(shí),要將文件指針指向空;如 FILE *fp = NULL;
2、文件操作完成后,需要將文件關(guān)閉,一定要注意,否則會(huì)造成文件所占用內(nèi)存泄露和在下次訪問(wèn)文件時(shí)出現(xiàn)問(wèn)題。
3、文件關(guān)閉后,需要將文件指針指向空,這樣做會(huì)防止出現(xiàn)游離指針,而對(duì)整個(gè)工程造成不必要的麻煩;如:fp = NULL;
二進(jìn)制文件
廣義的二進(jìn)制文件即指文件,由文件在外部設(shè)備的存放形式為二進(jìn)制而得名。狹義的二進(jìn)制文件即除文本文件以外的文件。文本文件是一種由很多行字符構(gòu)成的計(jì)算機(jī)文件。文本文件存在于計(jì)算機(jī)系統(tǒng)中,通常在文本文件最后一行放置文件結(jié)束標(biāo)志。文本文件的編碼基于字符定長(zhǎng),譯碼相對(duì)要容易一些;二進(jìn)制文件編碼是變長(zhǎng)的,靈活利用率要高,而譯碼要難一些,不同的二進(jìn)制文件譯碼方式是不同的。
從本質(zhì)上來(lái)說(shuō)他們之間沒(méi)有什么區(qū)別,因?yàn)樗麄冊(cè)?span style="color:rgb(228,175,9)">硬盤(pán)上都有一種的存放方式--二進(jìn)制,但是如果要對(duì)他們有些區(qū)分的話,那可以這樣理解。每個(gè)字符由一個(gè)或多個(gè)字節(jié)組成,每個(gè)字節(jié)都是用的-128—127之間的部分?jǐn)?shù)值來(lái)表示的,也就是說(shuō),-128——127之間還有一些數(shù)據(jù)沒(méi)有對(duì)應(yīng)任何字符的任何字節(jié)。如果一個(gè)文件中的每個(gè)字節(jié)的內(nèi)容都是可以表示成字符的數(shù)據(jù),我們就可以稱(chēng)這個(gè)文件為文本文件,可見(jiàn),文本文件只是二進(jìn)制文件中的一種特例,為了與文本文件相區(qū)別,人們又把除了文本文件以外的文件稱(chēng)為二進(jìn)制文件,由于很難嚴(yán)格區(qū)分文本文件和二進(jìn)制文件的概念,所以我們可以簡(jiǎn)單地認(rèn)為,如果一個(gè)文件專(zhuān)門(mén)用于存儲(chǔ)文本字符的數(shù)據(jù),沒(méi)有包含字符以外的其他數(shù)據(jù),我們就稱(chēng)之為文本文件,除此之外的文件就是二進(jìn)制文件。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: 第五人格蜡像师怎么加点
- 下一篇: LOL推荐ADC