C語言fopen等幾個f函數(shù)用法_第1頁
C語言fopen等幾個f函數(shù)用法_第2頁
C語言fopen等幾個f函數(shù)用法_第3頁
C語言fopen等幾個f函數(shù)用法_第4頁
C語言fopen等幾個f函數(shù)用法_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論