版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、C語言函數(shù)fopen函數(shù)簡介函數(shù)功能: 打開一個文件 函數(shù)原型:FILE * fopen(const char * path,const char * mode); 相關(guān)函數(shù):open,fclose,fopen_s1 ,_wfopen 所需庫: <stdio.h> 返回值: 文件順利打開后,指向該流的文件指針就會被返回。若果文件打開失敗則返回NULL,并把錯誤代碼存在errno 中。 一般而言,打開文件后會作一些文件讀取或?qū)懭氲膭幼?,若打開文件失敗,接下來的讀寫動作也無法順利進行,所以在fopen()后請作錯誤判斷及處理。 參數(shù)說明: 參數(shù)path字符串包含欲打開的文件路徑及文件名
2、,參數(shù)mode字符串則代表著流形態(tài)。 mode有下列幾種形態(tài)字符串: r 打開只讀文件,該文件必須存在。 r+ 打開可讀寫的文件,該文件必須存在。 rb+ 讀寫打開一個二進制文件,只允許讀寫數(shù)據(jù)。 rt+ 讀寫打開一個文本文件,允許讀和寫。 w 打開只寫文件,若文件存在則文件長度清為0,即該文件內(nèi)容會消失。若文件不存在則建立該文件。 w+ 打開可讀寫文件,若文件存在則文件長度清為零,即該文件內(nèi)容會消失。若文件不存在則建立該文件。 a 以附加的方式打開只寫文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數(shù)據(jù)會被加到文件尾,即文件原先的內(nèi)容會被保留。(EOF符保留) a+ 以附加方式打開可
3、讀寫的文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數(shù)據(jù)會被加到文件尾后,即文件原先的內(nèi)容會被保留。 (原來的EOF符不保留) wb 只寫打開或新建一個二進制文件;只允許寫數(shù)據(jù)。 wb+ 讀寫打開或建立一個二進制文件,允許讀和寫。 wt+ 讀寫打開或著建立一個文本文件;允許讀寫。 at+ 讀寫打開一個文本文件,允許讀或在文本末追加數(shù)據(jù)。 ab+ 讀寫打開一個二進制文件,允許讀或在文件末追加數(shù)據(jù)。 上述的形態(tài)字符串都可以再加一個b字符,如rb、w+b或ab等組合,加入b 字符用來告訴函數(shù)庫打開的文件為二進制文件,而非純文字文件。不過在POSIX系統(tǒng),包含Linux都會忽略該字符。由fo
4、pen()所建立的新文件會具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)權(quán)限,此文件權(quán)限也會參考umask 值。 有些C編譯系統(tǒng)可能不完全提供所有這些功能,有的C版本不用"r+","w+","a+",而用"rw","wr","ar"等,讀者注意所用系統(tǒng)的規(guī)定。表格 1. fopen() 中的 mode 的可能值列表 mode說明'r'只讀方式打開,將文件指針指向文件頭。 'r+'讀
5、寫方式打開,將文件指針指向文件頭。 'w'寫入方式打開,將文件指針指向文件頭并將文件大小截為零。如果文件不存在則嘗試創(chuàng)建之。 'w+'讀寫方式打開,將文件指針指向文件頭并將文件大小截為零。如果文件不存在則嘗試創(chuàng)建之。 'a'寫入方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創(chuàng)建之。 'a+'讀寫方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創(chuàng)建之。 'x'創(chuàng)建并以寫入方式打開,將文件指針指向文件頭。如果文件已存在,則 fopen() 調(diào)用失敗并返回 FALSE,并生成一條 E_WARNING 級別的
6、錯誤信息。如果文件不存在則嘗試創(chuàng)建之。這和給 底層的 open(2) 系統(tǒng)調(diào)用指定 O_EXCL|O_CREAT 標記是等價的。此選項被 PHP 4.3.2 以及以后的版本所支持,僅能用于本地文件。 'x+'創(chuàng)建并以讀寫方式打開,將文件指針指向文件頭。如果文件已存在,則 fopen() 調(diào)用失敗并返回 FALSE,并生成一條 E_WARNING 級別的錯誤信息。如果文件不存在則嘗試創(chuàng)建之。這和給 底層的 open(2) 系統(tǒng)調(diào)用指定 O_EXCL|O_CREAT 標記是等價的。此選項被 PHP 4.3.2 以及以后的版本所支持,僅能用于本地文件。 注: 不同的操作系統(tǒng)家族具有不
7、同的行結(jié)束習(xí)慣。當(dāng)你寫入一個文本文件并想插入一個新行時,你需要使用符合你操作系統(tǒng)的行結(jié)束符號?;?Unix 的系統(tǒng)使用 n 作為行結(jié)束字符,基于 Windows 的系統(tǒng)使用 rn 作為行結(jié)束字符,基于 Macintosh 的系統(tǒng)使用 r 作為行結(jié)束字符。 如果寫入文件時使用了錯誤的行結(jié)束符號,則其它應(yīng)用程序打開這些文件時可能會表現(xiàn)得很怪異。 Windows 下提供了一個文本轉(zhuǎn)換標記('t')可以透明地將 n 轉(zhuǎn)換為 rn。與此對應(yīng)你還可以使用 'b' 來強制使用二進制模式,這樣就不會轉(zhuǎn)換你的數(shù)據(jù)。要使用這些標記,要么用 'b' 或者用 '
8、;t' 作為 mode 參數(shù)的最后一個字符。 默認的轉(zhuǎn)換模式依賴于 SAPI 和你使用的 PHP 版本,因此為了便于移植鼓勵你總是指定恰當(dāng)?shù)臉擞?。?dāng)操作以 n 作為行結(jié)束定界符的純文本文件時,如果你還期望這些文件可以用于其它應(yīng)用程序例如 Notepad,則應(yīng)該在腳本中使用 't' 模式。在所有其它情況下使用 'b'。 在操作二進制文件時如果沒有指定 'b' 標記,可能會碰到一些奇怪的問題,包括壞掉的圖片文件以及關(guān)于 rn 字符的奇怪問題。 注: 為移植性考慮,強烈建議在用 fopen() 打開文件時總是使用 'b' 標記。
9、 注: 再一次,為移植性考慮,強烈建議你重寫那些依賴于 't' 模式的代碼使其使用正確的行結(jié)束符并改成 'b' 模式。 如果也需要在 include_path 中搜尋文件的話,可以將可選的第三個參數(shù) use_include_path 設(shè)為 '1' 或 TRUE。 如果打開失敗,本函數(shù)返回 FALSE。 程序示例程序示例1 #include <stdio.h> #include <stdlib.h> /為了使用exit() int main() int ch; FILE* fp; char fname50; /用于存放文件名
10、 printf("輸入文件名:"); scanf("%s",fname); fp=fopen(fname,"r"); /只供讀取 if(fp=NULL) /如果失敗了 printf("錯誤!"); exit(1); /中止程序 /getc()用于在打開文件中獲取一個字符 while(ch=getc(fp)!=EOF) putchar(ch); fclose(fp); /關(guān)閉文件 return 0; Djx:#include <stdio.h>#include <stdlib.h> /為了使用
11、exit()int main() int ch; FILE* fp; char fname50; /用于存放文件名 printf("輸入文件名:"); scanf("%s",fname); fp=fopen(fname,"r"); /只供讀取 if(fp=NULL) /如果失敗了 printf("錯誤!"); exit(1); /中止程序 /getc()用于在打開文件中獲取一個字符 while(ch=getc(fp)!=EOF) putchar(ch); fclose(fp); /關(guān)閉文件 system("
12、;pause");return 0; 注意!初學(xué)者往往會犯一個錯誤,即在輸入文件名時不加后綴名,請注意加上! 程序示例22 #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 ) / C499
13、6 / Note: fopen is deprecated; consider using fopen_s instead printf( "The file 'crt_fopen.c' was not openedn" ); else printf( "The file 'crt_fopen.c' was openedn" ); / Open for write if( (stream2 = fopen( "data2", "w+" ) = NULL ) / C4996 print
14、f( "The file 'data2' was not openedn" ); else printf( "The file 'data2' was openedn" ); / Close stream if it is not NULL if( stream) if ( fclose( stream ) ) printf( "The file 'crt_fopen.c' was not closedn" ); / All other files are closed: numclos
15、ed = _fcloseall( ); printf( "Number of files closed by _fcloseall: %un", numclosed ); 說明 resource fopen ( string filename, string mode , bool use_include_path , resource zcontext ) fopen() 將 filename 指定的名字資源綁定到一個流上。如果 filename 是 "scheme:/." 的格式,則被當(dāng)成一個 URL,PHP 將搜索協(xié)議處理器(也被稱為封裝協(xié)議)來處
16、理此模式。如果該協(xié)議尚未注冊封裝協(xié)議,PHP 將發(fā)出一條消息來幫助檢查腳本中潛在的問題并將 filename 當(dāng)成一個普通的文件名繼續(xù)執(zhí)行下去。 如果 PHP 認為 filename 指定的是一個本地文件,將嘗試在該文件上打開一個流。該文件必須是 PHP 可以訪問的,因此需要確認文件訪問權(quán)限允許該訪問。如果激活了 安全模式 或者 open_basedir 則會應(yīng)用進一步的限制。2 函數(shù)名: fclose 功 能: 關(guān)閉一個流。注意:使用fclose函數(shù)就可以把緩沖區(qū)內(nèi)最后剩余的數(shù)據(jù)輸出到磁盤文件中,并釋放文件指針和有關(guān)的緩沖區(qū)。 用 法: int fclose(FILE *stream);fr
17、ead函數(shù)和fwrite函數(shù)C,C+編程 2009-07-01 21:14:23 閱讀1686 評論3 字號:大中小 訂閱 source: 1.函數(shù)功能 用來讀寫一個數(shù)據(jù)塊。2.一般調(diào)用形式 fread(buffer,size,count,fp); fwrite(buffer,size,count,fp);3.說明 (1)buffer:是一個指針,對fread來說,它是讀入數(shù)據(jù)的存放地址。對fwrite來說,是要輸出數(shù)據(jù)的地址。 (2)size:要讀寫的字節(jié)數(shù); (3)count:要進行讀
18、寫多少個size字節(jié)的數(shù)據(jù)項; (4)fp:文件型指針。 注意:1 完成次寫操(fwrite()作后必須關(guān)閉流(fclose(); 2 完成一次讀操作(fread()后,如果沒有關(guān)閉流(fclose(),則指針(FILE * fp)自動向后移動前一次讀寫的長度,不關(guān)閉流繼續(xù)下一次讀操作則接著上次的輸出繼續(xù)輸出; 3 fprin
19、tf() : 按格式輸入到流,其原型是int fprintf(FILE *stream, const char *format, argument, .);其用法和printf()相同,不過不是寫到控制臺,而是寫到流罷了。注意的是返回值為此次操作寫入到文件的字節(jié)數(shù)。如int c = fprintf(fp, "%s %s %d %f", str1,str2, a, b) ;str1:10字節(jié);str2: 10字節(jié);a:2字節(jié);b:8字節(jié),c為33,因為寫入時不同的數(shù)據(jù)間自動加入一個空格。文件使用之后一定要關(guān)閉,否則將不能正確顯示內(nèi)容.fwrite:讀入兩個學(xué)生信息然后用fwr
20、ite存入文件fread:用fread從文件中讀出學(xué)生信息。 fwrite.c#include <stdio.h>#define SIZE 2struct student_type char name10; int num; int age; char addr10;studSIZE;void save() FILE *fp; int i; if(fp=fopen("stu_list","wb")=NULL) printf("ca
21、nt open the file"); exit(0); for(i=0;i<SIZE;i+) if(fwrite(&studi,sizeof(struct student_type),1,fp)!=1) printf("file write errorn"); fclose(fp);main() int i; for(i=0;i<SIZE;i+) scanf(&
22、quot;%s%d%d%s",&,&studi.num,&studi.age,&studi.addr); save(); for(i=0;i<SIZE;i+) printf("%s,%d,%d",,studi.num,studi.age,studi.addr); fread.c#include <stdio.h>#define SIZE 2struct stud
23、ent_type char name10; int num; int age; char addr10;studSIZE;void read() FILE *fp; int i; if(fp=fopen("stu_list","rb")=NULL) printf("cant open the file"); exit(0); for(i=0;i<SIZE;i+) if
24、(fread(&studi,sizeof(struct student_type),1,fp)!=1) printf("file read errorn"); fclose(fp);main() int i; read(); for(i=0;i<SIZE;i+) printf("%s,%d,%d,%s",,studi.num,studi.age,studi.addr); pr
25、intf("n"); printf與fprintf函數(shù)的區(qū)別printf是標準輸出流的輸出函數(shù),用來向屏幕這樣的標準輸出設(shè)備輸出,而fprintf則是向文件輸出,將輸出的內(nèi)容輸出到硬盤上的文件或是相當(dāng)于文件的設(shè)備上printf是有緩沖的輸出,fprintf沒有緩沖fprintf()傳送輸出到一個流中的函數(shù)原形:int fprintf(FILE *stream,const char *format,argument,.)功能 <javascript:void(0)>:向文件指針指向的文件輸出ASC代碼向顯示器輸出錯誤信息 <javascript:v
26、oid(0)>使用形式:fprintf(文件指針,"輸出格式",輸出項系列);fprintf(stderr,"錯誤信息");使用實例:fprintf(stream,"%d %c %f",i,c,f);其中定義FILE *stream;int i;char c;float f;返回值:成功則返回輸出的字節(jié)數(shù),錯誤則返回EOF。頭文件:stdio.h=sprintf()格式化輸出到數(shù)組的函數(shù)原形int sprintf(buf,format,arg_list)其中char *buf;功能把arg_list參量的值按format的格式輸
27、出到buf中。例sprintf(buffer,"相對扇區(qū)號%s(其中柱面號為%d/磁頭號為%d/扇區(qū)號為%d)",string,cyls,head,sector);其中char buffer100;char *string=""int cyls,head,sector;返回值實際寫入數(shù)組的字符個數(shù)。頭文件stdio.hsprintf 是個變參函數(shù),定義如下:int sprintf(char *buffer,const char *format , argument . );除了前兩個參數(shù)類型固定外,后面可以接任意多個參數(shù)。而它的精華,顯然就在第二個參數(shù):
28、格式化字符串上。printf 和sprintf 都使用格式化字符串來指定串的格式,在格式串內(nèi)部使用一些以“%”開頭的格式說明符(format specifications)來占據(jù)一個位置,在后邊的變參列表中提供相應(yīng)的變量,最終函數(shù)就會用相應(yīng)位置的變量來替代那個說明符,產(chǎn)生一個調(diào)用者想要的字符串。格式化數(shù)字字符串sprintf 最常見的應(yīng)用之一莫過于把整數(shù)打印到字符串中.格式化讀寫函數(shù)fscanf和fprintffscanf函數(shù),fprintf函數(shù)與前面使用的scanf和printf 函數(shù)的功能相似,都是格式化讀寫函數(shù)。 兩者的區(qū)別在于 fscanf 函數(shù)和fprintf函數(shù)的讀寫對象不是鍵盤和
29、顯示器,而是磁盤文件。這兩個函數(shù)的調(diào)用格式為: fscanf(文件指針,格式字符串,輸入表列); fprintf(文件指針,格式字符串,輸出表列); 例如:fscanf(fp,"%d%s",&i,s);fprintf(fp,"%d%c",j,ch);用fscanf和fprintf函數(shù)也可以完成以上學(xué)生信息的問題。修改后的程序下所示。#include<stdio.h>struct stuchar name10;int num;int age;char addr15;boya2,boyb2,*pp,*qq;main()FILE *fp;c
30、har ch;int i;pp=boya;qq=boyb;if(fp=fopen("stu_list","wb+")=NULL)printf("Cannot open file strike any key exit!");getch();exit(1);printf("ninput datan");for(i=0;i<2;i+,pp+)scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);pp=
31、boya;for(i=0;i<2;i+,pp+)fprintf(fp,"%s %d %d %sn",pp->name,pp->num,pp->age,pp->addr);rewind(fp);for(i=0;i<2;i+,qq+)fscanf(fp,"%s %d %d %sn",qq->name,&qq->num,&qq->age,qq->addr);printf("nnnametnumber age addrn");qq=boyb;for(i=0;i<
32、2;i+,qq+)printf("%st%5d %7d %sn",qq->name,qq->num, qq->age,qq->addr);fclose(fp);Ferror和clearerr函數(shù)名: ferror 功 能: 在調(diào)用各種輸入輸出函數(shù)(如 putc.getc.fread.fwrite等)時,如果出現(xiàn)錯誤,除了函數(shù)返回值有所反映外,還可以用ferror函數(shù)檢查。 它的一般調(diào)用形式為 ferroe(fp);如果ferror返回值為0(假),表示未出錯。如果返回一個非零值,表示出錯。應(yīng)該注意,對同一個文件 每一次調(diào)用輸入輸出函數(shù),均產(chǎn)生一個新的ferror函
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 期貨標準合同范本
- 光伏投資合同范本
- 校車合同范本
- 借款合同 還款合同范本
- 家庭裝修承包合同范本
- 購買方木合同范本
- 酒店桌椅合同范本
- 《情事變更原則中再交涉制度研究》
- 《整合素α5在牙齒萌出硬組織通道形成中的作用及相關(guān)機制研究》
- 花都打井合同范本
- 2022年病歷質(zhì)控考核標準完整
- 教師爭做新時代的“大先生”心得體會8篇
- 腰椎間盤突出健康教育課件
- 大學(xué)生勞動教育PPT完整全套教學(xué)課件
- 公共事務(wù)管理專業(yè)
- 高中思想政治-高三一輪復(fù)習(xí)課文化創(chuàng)新教學(xué)設(shè)計學(xué)情分析教材分析課后反思
- 高中美術(shù)-文化變革 美術(shù)發(fā)展教學(xué)設(shè)計學(xué)情分析教材分析課后反思
- 品管圈標準化作業(yè)書模板
- 尊敬師長遵守紀律課件高中生文明禮儀教育主題班會
- 合理利用多媒體技術(shù)助力課堂教學(xué)效果提升獲獎科研報告
- 裁判員勞動合同
評論
0/150
提交評論