第13-2講 文件操作_第1頁
第13-2講 文件操作_第2頁
第13-2講 文件操作_第3頁
第13-2講 文件操作_第4頁
第13-2講 文件操作_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1函數(shù)原型:char*fgets(char*s,intn,FILE*fp)intfputs(char*s,FILE*fp)功能:從fp指向的文件讀/寫一個字符串返值:fgets正常時返回讀取字符串的首地址;出錯或文件尾,返回NULLfputs正常時返回寫入的最后一個字符;出錯為EOF[案例3]將磁盤文件中的字符串讀出,并顯示在屏幕上。fgets從fp所指文件讀n-1個字符送入s指向的內存區(qū),并在最后加一個‘\0’(若讀入n-1個字符前遇換行符或文件尾(EOF)即結束)fputs把s指向的字符串寫入fp指向的文件

讀/寫一個字符串──fgets()和fputs()#include<stdio.h>voidmain(){FILE*fp;

charstring[81];

if((fp=fopen("d:\\in.txt","r"))==NULL){ printf("cann'topenfile"); exit(1);}

if(fgets(string,81,fp)!=NULL)fputs(string,stdout);fclose(fp);}[案例3+]將磁盤文件中的字符串讀出,并存儲在另外一個文件中。2

讀/寫一個數(shù)據(jù)塊──fread()和fwrite()1.函數(shù)原型:intfread(void*buffer,intsize,intcount,F(xiàn)ILE*fp);intfwrite(void*buffer,intsize,intcount,F(xiàn)ILE*fp);2.功能:

fread()──從fp所指向文件的當前位置開始,一次讀入size個字節(jié),重復count次,并將讀入的數(shù)據(jù)存放到從buffer開始的內存中;同時,將讀寫位置指針向前移動size*count個字節(jié)。其中,buffer是存放讀入數(shù)據(jù)的起始地址(即存放何處)。

fwrite()──從buffer開始,一次輸出size個字節(jié),重復count次,并將輸出的數(shù)據(jù)存放到fp所指向的文件中;同時,將讀寫位置指針向前移動size*count個字節(jié)。其中,buffer是要輸出數(shù)據(jù)在內存中的起始地址(即從何處開始輸出)。如果調用fread()或fwrite()成功,則函數(shù)返回值等于count,否則為0。

fread()和fwrite()函數(shù),一般用于二進制文件的處理。3例4從鍵盤輸入4個學生數(shù)據(jù),把他們轉存到磁盤文件中去,再從文件讀出顯示到屏幕上分析:(1)建立學生信息的結構體。(2)定義文件指針。(3)以寫方式打開指定的文件。(4)從鍵盤輸入學生信息,并將數(shù)據(jù)寫入文件,寫完后關閉該文件。(可用一個子函數(shù)來實現(xiàn))(5)再次打開該文件,讀出所有學生信息,并顯示到屏幕上,讀完后關閉該文件。(可用一個子函數(shù)來實現(xiàn))#include<stdio.h>structstudent_type{charname[10];intnum;intage;}stud[3];main(){inti;for(i=0;i<3;i++)scanf("%s%d%d",stud[i].name,&stud[i].num,&stud[i].age);if(save()==1)printf("saveerror");if(display()==1)printf("saveerror");}4intsave(){FILE*fp;inti;if((fp=fopen("d:\\stu","wb"))==NULL){printf("cannotopenfile\n"); return1;}for(i=0;i<3;i++)

if(fwrite(&stud[i],sizeof(structstudent_type),1,fp)!=1) printf("filewriteerror\n");fclose(fp);return0;}5intdisplay(){FILE*fp;inti;if((fp=fopen("d:\\stu","rb"))==NULL){printf("cannotopenfile\n"); return1;}for(i=0;i<3;i++){fread(&stud[i],sizeof(structstudent_type),1,fp);printf("%-10s%4d%4d\n",stud[i].name,stud[i].num,stud[i].age);}fclose(fp);return0;}6

對文件進行格式化讀/寫──fscanf()和fprintf()函數(shù)

與scanf()和printf()函數(shù)的功能相似,區(qū)別在于:fscanf()和fprintf()函數(shù)的操作對象是指定文件,而scanf()和printf()函數(shù)的操作對象是標準輸入(stdin)輸出(stdout)文件。

intfprintf(FILE*fp,constchar*format,[argument,…])intfscanf(FILE*fp,constchar*format,[argument,…])功能:按格式對文件進行I/O操作返值:成功,返回I/O的個數(shù);出錯或文件尾,返回EOF

例如,......inti=3;floatf=9.80;......fprintf(fp,"%2d,%6.2f",i,f);......fprintf()函數(shù)的作用是,將變量i按%2d格式、變量f按%6.2f格式,以逗號作分隔符,輸出到fp所指向的文件中:□3,□□9.80(□表示1個空格)。

7讀/寫函數(shù)的選用原則從功能角度來說,fread()和fwrite()函數(shù)可以完成文件的任何數(shù)據(jù)讀/寫操作。但為方便起見,依下列原則選用:

1.讀/寫一個字符(或字節(jié))數(shù)據(jù)時:選用fgetc()和fputc()函數(shù)。

2.讀/寫一個字符串時:選用fgets()和fputs()函數(shù)。

3.讀/寫一個(或多個)不含格式的數(shù)據(jù)時: 選用fread()和fwrite()函數(shù)。

4.讀/寫一個(或多個)含格式的數(shù)據(jù)時: 選用fscanf()和fprintf()函數(shù)。

8

位置指針與文件定位文件中有一個讀寫位置指針,指向當前的讀寫位置。每次讀寫一個(或一組)數(shù)據(jù)后,系統(tǒng)自動將位置指針移動到下一個讀寫位置上。讀寫方式順序讀寫:位置指針按字節(jié)位置順序移動,叫~隨機讀寫:位置指針按需要移動到任意位置,叫~位置指針復位函數(shù)rewind()1.用法:voidrewind(文件指針);2.功能:使文件的位置指針返回到文件頭。

9

fseek()函數(shù)

1.用法:intfseek(文件指針,位移量,參照點);intfseek(FILE*fp,longintoffset,intwhence)2.功能:將指定文件的位置指針,從參照點開始,移動指定的字節(jié)數(shù)。(1)參照點:用0(文件頭)、1(當前位置)和2(文件尾)表示。在ANSIC標準中,還規(guī)定了下面的名字:

SEEK_SET──文件頭,

SEEK_CUR──當前位置,

SEEK_END──文件尾(2)位移量:以參照點為起點,正向偏移(當位移量>0時)或負向偏移(當位移量<0時)的字節(jié)數(shù)。位移量一般被要求是long型數(shù)據(jù),這樣當文件的長度大于64K時不致出問題。3.返值:成功為0,失敗為非0.fseek()函數(shù)一般用于二進制文件。10注意:位移量一般被要求是long型數(shù)據(jù),這樣當文件的長度大于64K時不致出問題。fseek函數(shù)調用的幾個例子:fseek(fp,100L,SEEK_SET);將指針從文件頭正向移動100個字節(jié)fseek(fp,100L,SEEK_CUR);將位置指針從當前位置正向移動50個字節(jié)fseek(fp,-100L,SEEK_END);將位置指針從文件末尾處負向偏移100個字節(jié)11返回文件當前位置的函數(shù)ftell()由于文件的位置指針可以任意移動,也經(jīng)常移動,往往容易迷失當前位置,ftell()就可以解決這個問題。

1.用法:longintftell(文件指針);2.功能:返回文件位置指針的當前位置(用相對于文件頭的位移量表示)。如果返回值為-1L,則表明調用出錯。例如:offset=ftell(fp);

if(offset==-1L)printf(“ftell()error\n”);

12例5磁盤文件上有3個學生數(shù)據(jù),要求讀入第2學生數(shù)據(jù)并顯示。#include<stdio.h>structstudent_type{charname[10];intnum;intage;}stud;main(){inti=0;FILE*fp;if((fp=fopen("d:\\stu","rb"))==NULL){printf("can'topenfile\n");exit(1);}rewind(fp);fseek(fp,1*sizeof(structstudent_type),SEEK_SET);fread(&stud,sizeof(structstudent_type),1,fp);printf("%s%d%d\n",,stud.num,stud.age);fclose(fp);}13

出錯檢測

ferror()函數(shù)

在調用輸入輸出庫函數(shù)時,如果出錯,除了函數(shù)返回值有所反映外,也可利用ferror()函數(shù)來檢測。

1.用法:intferror(文件指針);

2.功能:如果函數(shù)返回值為0,表示未出錯;如果返回一個非0值,表示出錯。

(1)對同一文件,每次調用輸入輸出函數(shù)均產(chǎn)生一個新的ferror()函數(shù)值。因此在調用了輸入輸出函數(shù)后,應立即檢測,否則出錯信息會丟失。

(2)在執(zhí)行fopen()函數(shù)時,系統(tǒng)將ferror()的值自動置為0。clearerr()函數(shù)1.用法:voidclearerr(文件指針);2.功能:將文件錯誤標志(即ferror()函數(shù)的值)和文件結束標志(即feof()函數(shù)的值)置為0。對同一文件,只要出錯就一直保留,直至遇到clearerr()函數(shù)或rewind()函數(shù),或其它任何一個輸入輸出庫函數(shù)。14文件輸入輸出小結分類函數(shù)名功能打開文件fopen()打開文件關閉文件fclose()關閉文件文件定位fseek()改變文件位置的指針位置rewind()使文件位置指針重新置于文件開頭ftell()返回文件位置指針的當前值文件讀寫fgetc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論