C語言程序設(shè)計文件_第1頁
C語言程序設(shè)計文件_第2頁
C語言程序設(shè)計文件_第3頁
C語言程序設(shè)計文件_第4頁
C語言程序設(shè)計文件_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

11.1C文件概述11.2文件類型指針11.3文件的打開與關(guān)閉11.4文件的讀寫11.5文件的定位第11章文件5/13/20241《C語言程序設(shè)計》-第十一章11.1C文件概述文件:存儲在外部介質(zhì)上數(shù)據(jù)的集合,是操作系統(tǒng)數(shù)據(jù)管理的單位。文件分類:按存儲介質(zhì):普通文件:存儲介質(zhì)文件(磁盤、磁帶等)。設(shè)備文件:非存儲介質(zhì)(鍵盤、顯示器、打印機等)。按數(shù)據(jù)的組織形式:ASCII文件(文本文件):每個字節(jié)存放ASCII碼,表示一個字符。二進制文件:數(shù)據(jù)按其在內(nèi)存中的存儲形式原樣存放。5/13/20242《C語言程序設(shè)計》-第十一章例:整數(shù)100000010011100010000內(nèi)存存儲形式0010011100010000二進制形式0011000100110000001100000011000000110000ASCII形式文本文件特點:存儲量大,轉(zhuǎn)換為二進制速度慢,直觀易記。二進制文件特點:存儲量小,無需轉(zhuǎn)換。但因一個字節(jié)不對應(yīng)一個字符,故不能直接輸出其字符形式。5/13/20243《C語言程序設(shè)計》-第十一章

文件系統(tǒng)緩沖文件系統(tǒng)(高級文件系統(tǒng)):系統(tǒng)自動為正在使用的文件開辟內(nèi)存緩沖區(qū)。非緩沖文件系統(tǒng)(低級文件系統(tǒng)):由用戶在程序中為每個文件設(shè)定緩沖區(qū)。磁盤文件輸出文件緩沖區(qū)輸入文件緩沖區(qū)程序數(shù)據(jù)區(qū)a緩沖文件系統(tǒng)緩沖區(qū)指令區(qū)程序用戶數(shù)據(jù)區(qū)磁盤文件非緩沖文件系統(tǒng)5/13/20244《C語言程序設(shè)計》-第十一章11.2文件類型指針文件類型結(jié)構(gòu)體FILE

緩沖文件系統(tǒng)為每個正使用的文件在內(nèi)存開辟文件信息區(qū)。文件信息用系統(tǒng)定義的名為FILE的結(jié)構(gòu)體描述。FILE定義在stdio.h中。typedef

struct/*TurboC文件類型聲明*/{shortlevel;/*緩沖區(qū)滿/空程度*/unsignedflags;/*文件狀態(tài)標志*/charfd;/*文件描述符*/unsignedcharhold;/*若無緩沖區(qū)不讀取字符*/shortbsize;/*緩沖區(qū)大小*/unsignedchar*buffer;/*數(shù)據(jù)傳送緩沖區(qū)位置*/unsignedchar*curp;/*當前讀寫位置*/unsignedistemp;/*臨時文件指示*/shorttoken;/*用作無效檢測*/}FILE;/*結(jié)構(gòu)體類型名FILE*/5/13/20245《C語言程序設(shè)計》-第十一章文件指針定義形式FILE*文件結(jié)構(gòu)指針名;用法:文件打開時,系統(tǒng)自動建立文件結(jié)構(gòu)體,并把指向它的指針返回來,程序通過這個指針獲得文件信息,訪問文件。文件關(guān)閉后,它的文件結(jié)構(gòu)體被釋放。文件名文件使用方式文件類型指針C程序操作系統(tǒng)磁盤FILE*fp;5/13/20246《C語言程序設(shè)計》-第十一章打開文件fopen函數(shù)首部:

FILE*fopen(char*filename,char*mode)功能:按指定方式打開文件。返值:正常打開,為指向文件結(jié)構(gòu)體的指針;打開失敗,為NULL。11.3文件的打開與關(guān)閉要打開的文件名使用文件方式例:文件打開與測試。

FILE*fp;if((fp=fopen(“filename”,“rb+”))==NULL){printf(“cannotopenthisfile\n”);exit(0);}例FILE*fp;

fp=fopen(“c:\test”,”rb+”);

“r+/rb+”(讀寫)“a/ab”(追加)“w/wb”(只寫)“r/rb”(只讀)“w+/wb+”(讀寫)“a+/ab+”(讀寫)為輸入打開一個文本/二進制文件為輸出打開或建立一個文本/二進制文件為讀/寫打開一個文本/二進制文件為讀/寫建立一個文本/二進制文件為讀/寫打開或建立一個文本/二進制文件向文本/二進制文件尾追加數(shù)據(jù)文件使用方式含義系統(tǒng)自動打開和關(guān)閉的五個標準設(shè)備文件:文件號文件指針標準文件0stdin標準輸入(鍵盤)1stdout標準輸出(顯示器)2stderr標準錯誤(顯示器)3stdaux標準輔助(輔助設(shè)備端口)4stdprn標準打?。ù蛴C)5/13/20247《C語言程序設(shè)計》-第十一章文件關(guān)閉fclose函數(shù)首部:int

fclose(FILE*fp)功能:關(guān)閉fp指向的文件,釋放文件結(jié)構(gòu)體和文件指針。返值:正常為0;出錯為非0。文件打開時返回的文件類型指針磁盤文件輸出文件緩沖區(qū)輸入文件緩沖區(qū)程序數(shù)據(jù)區(qū)a緩沖文件系統(tǒng):fclose不關(guān)閉文件可能會丟失數(shù)據(jù)5/13/20248《C語言程序設(shè)計》-第十一章11.4文件的讀寫字符輸出fputc函數(shù)原型:int

fputc(int

ch,FILE*fp)功能:把一字符ch寫入fp指向的文件中。返值:正常,返回ch;出錯,為EOF。字符輸入fgetc函數(shù)原型:int

fgetc(FILE*fp)功能:從fp指向的文件中讀取一個字符。返值:正常,返回讀取的字符;讀到文件尾或出錯時,為EOF。

文件I/O與終端I/O#defineputc(ch,fp)fputc(ch,fp)#definegetc(fp)fgetc(fp)#defineputchar(ch)fputc(ch,stdout)#definegetchar()fgetc(stdin)5/13/20249《C語言程序設(shè)計》-第十一章[例]從鍵盤輸入一些字符,逐個把它們存到磁盤文件中,直到輸入‘#“結(jié)束。#include"stdio.h"main(){charch,filename[20];FILE*fp;

scanf("%s",filename);

if((fp=fopen(filename,"w"))==NULL){printf("cannotopenthisfile\n");exit(0);}

while((ch=getchar())!='#')

{

fputc(ch,fp);

putchar(ch);}

fclose(fp);}file1.txtComputerandC#computerandCC:>typefile1.txtComputerandc5/13/202410《C語言程序設(shè)計》-第十一章文件結(jié)束feof函數(shù)原型:int

feof(FILE*fp)功能:判斷文件是否結(jié)束。返值:文件結(jié)束,返回真(非0);文件未結(jié)束,返回0。5/13/202411《C語言程序設(shè)計》-第十一章字符串輸入

fgets函數(shù)首部:

char*fgets(char*str,intlength,FILE*fp);功能:從fp所指向的文件中,至多讀length-1個字符,送入字符數(shù)組str中,如果在讀入length-1個字符結(jié)束前遇換行符或EOF,讀入即結(jié)束,字符串讀入后在最后加一個‘\0’字符。返值:正常,返str指針;出錯,返空指針NULL。字符串輸出fputs函數(shù)首部:int

fputs(char*str,FILE*fp);功能:把str指向的字符串寫入fp指向的文件。返值:正常,返0;出錯返EOF。5/13/202412《C語言程序設(shè)計》-第十一章#include"stdio.h"#defineSIZE256main(){charch[SIZE];

intc,line;FILE*fp;

if((fp=fopen(“test.txt"

,"r"))==NULL){

printf(“Thefilecannotopen\n");exit(0);}line=1;

while(fgets(ch,SIZE,fp)!=NULL)printf("%4d\t%s\n",line++,ch);

fclose(fp);}[例]讀取文本文件的內(nèi)容,并加上行號顯示。5/13/202413《C語言程序設(shè)計》-第十一章字段輸入fread/輸出fwrite函數(shù)首部:int

fread(void*buffer,intnum_bytes,intcount,FILE*fp);int

fwrite(void*buffer,intnum_bytes,intcount,FILE*fp);功能:讀/寫數(shù)據(jù)塊。返值:成功,返回讀/寫的字段數(shù);出錯或文件結(jié)束,返回0。說明:buffer:指向要輸入/輸出數(shù)據(jù)存儲區(qū)的首地址的指針num_bytes:每個要讀/寫的字段的字節(jié)數(shù)count:要讀/寫的字段的個數(shù)fp:要讀/寫的文件指針fread與fwrite

一般用于二進制文件的輸入/輸出。5/13/202414《C語言程序設(shè)計》-第十一章例floatf[2];FILE*fp;

fp=fopen(“aa.dat”,“rb”);

fread(f,4,2,fp);for(i=0;i<2;i++)

fread(&f[i],4,1,fp);例structstudent{intnum;charname[20];charsex;

intage;floatscore[3];}stud[10];for(i=0;i<10;i++)

fread(&stud[i],sizeof(structstudent),1,fp);5/13/202415《C語言程序設(shè)計》-第十一章格式化輸入fscanf/輸出fprintf函數(shù)首部:

int

fscanf(FILE*fp,char*format,arg_list);

int

fprintf(FILE*fp,constchar*format,arg_list);功能:按format格式對fp指向的文件進行I/O操作。返值:成功,返回I/O的個數(shù);出錯或文件尾,返回EOF。例fscanf(fp,“%d%f”,&i,&f);

//若文件中有3,4.5,則將3送入i,4.5送入f

fprintf(fp,“%d,%f”,i,f);

///將i和t按%d,%f格式輸出到fp文件例:從鍵盤按格式輸入數(shù)據(jù)存到磁盤文件中去,并回顯到屏幕上。#include<stdio.h>main(){chars[80],c[80];

inta,b;FILE*fp;

if((fp=fopen("test","w"))==NULL){puts("can'topenfile");exit();}

fscanf(stdin,“%s%d”,s,&a);/*鍵盤輸入*/

fprintf(fp,“%s%d”,s,a);/*寫入文件*/

fclose(fp);

if((fp=fopen("test","r"))==NULL){puts("can'topenfile");exit();}

fscanf(fp,“%s%d”,c,&b);/*從文件讀出*/

fprintf(stdout,“%s%d”,c,b);/*屏幕顯示*/

fclose(fp);}5/13/202416《C語言程序設(shè)計》-第十一章11.5文件的定位文件位置指針:指向當前讀寫位置的指針。讀寫方式:順序讀寫:位置指針按字節(jié)位置順序移動。隨機讀寫:位置指針按需要移動到任意位置。

rewind函數(shù)函數(shù)首部:voidrewind(FILE*fp);功能:使fp所指文件的位置指針重置到文件開頭。返值:無例:對一個磁盤文件進行顯示和復(fù)制兩次操作。#include<stdio.h>main(){FILE*fp1,*fp2;fp1=fopen("d:\\fengyi\\bkc\\ch12_4.c","r");fp2=fopen("d:\\fengyi\\bkc\\ch12_41.c","w");while(!feof(fp1))putchar(getc(fp1));

rewind(fp1);while(!feof(fp1))putc(getc(fp1),fp2);

fclose(fp1);fclose(fp2);}5/13/202417《C語言程序設(shè)計》-第十一章

fseek函數(shù)函數(shù)原型:int

fseek(FILE*fp,long

offset,intorigin);功能:改變文件位置指針的位置。返值:成功,返回0;失敗,返回非0值。文件指針位移量(以起始點為基點,移動的字節(jié)數(shù))>0

向后移動<0

向前移動起始點文件開始

SEEK_SET0文件當前位置

SEEK_CUR1文件末尾

SEEK_END2

fseek(fp,100L,0);fseek(fp,-20L,SEEK_END);fseek(fp,50L,1);

5/13/202418《C語言程序設(shè)計》-第十一章#include<stdio.h>structstudent_type{intnum;charname[10];intage;charsex;}st[10];main(){inti;FILE*fp;

if((fp=fopen("studd.dat","rb"))==NULL){printf("can'topenfile\n");exit(0);}

for(i=0;i<10;i+=2){fseek(fp,i*sizeof(structstudent_type),0);

fread(&stud[i],sizeof(structstudent_type),1,fp);

printf("%s%d%d%c\n",st[i].name,st[i].num,st[i].age,st[i].sex);}

fclose(fp);}[例]磁盤文件stud.dat中存有10個學(xué)生數(shù)據(jù),要求將第2,4,6,8,10個學(xué)生數(shù)據(jù)顯示在屏幕上。5/13/202419《C語言程序設(shè)計》-第十一章ftell()函數(shù)函數(shù)首部:longftell(FILE*fp);功能:得到文件中的當前位置,用相對于文件開頭的位移量來表示。返值:返回fp所指向的文件中的讀寫位置(字節(jié)數(shù));出錯,返-1L。#include"stdio.h"main(){int

i,len;

FILE*fp;

if((fp=fopen("studd.dat","a"))==NULL){printf("can'topenfile\n");exit(0);}

for(i=0;i<10;i++){ch=getchar();fputc(ch,fp1);}

len=ftell(fp1);

printf("thefilelengthis%d",len);fclose(fp1);}5/13/202420《C語言程序設(shè)計》-第十一章小結(jié)1.C文件的概念

(1)C語言中文件不是由記錄組成,而是被看做一個字符(字節(jié))的序列,稱為流式文件。(2)C文件根據(jù)數(shù)據(jù)的組織形式可分為ASCII(文本)文件和二進制文件。(3)C語言對文件的處理方法為緩沖文件系統(tǒng)和非緩沖文件系統(tǒng)。ANSIC標準采用緩沖文件系統(tǒng)。(4)在緩沖文件系統(tǒng)中是靠文件指針與相應(yīng)文件建立起

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論