文件是存儲在外部介質(zhì)上的數(shù)據(jù)的集合_第1頁
文件是存儲在外部介質(zhì)上的數(shù)據(jù)的集合_第2頁
文件是存儲在外部介質(zhì)上的數(shù)據(jù)的集合_第3頁
文件是存儲在外部介質(zhì)上的數(shù)據(jù)的集合_第4頁
文件是存儲在外部介質(zhì)上的數(shù)據(jù)的集合_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

10、文件10.1概述?

文件是存儲在外部介質(zhì)上的數(shù)據(jù)的集合,由操作系統(tǒng)來管理。最常用的是磁盤文件。?從文件數(shù)據(jù)的組織形式可分為文本文件和二進(jìn)制文件。

源程序文件一般是文本文件

數(shù)據(jù)文件可是文本文件,也可是二進(jìn)制文件?C語言把文件都看作“字節(jié)流”文件,也稱“流式文件”,對文件的讀寫是以字節(jié)為單位的。

C語言中的文本文件的每個字節(jié)代表一個字符,存放的是該字符的ASCII碼

C語言中的二進(jìn)制文件是把數(shù)據(jù)按其在內(nèi)存中的存儲形式照原樣輸出到磁盤上?C語言中對文件處理的方法可分為兩種:

緩沖文件系統(tǒng)系統(tǒng)自動為打開的文件開辟其各自的內(nèi)存緩沖區(qū),本章介紹的文本文件和二進(jìn)制文件都屬此種非緩沖文件系統(tǒng)系統(tǒng)不自動開辟內(nèi)存緩沖區(qū),而由用戶根據(jù)需要在程序中設(shè)定10.2文件類型(FILE)指針?FILE類型處理一個文件須知它的各種信息,這些信息由系統(tǒng)將其構(gòu)成一個結(jié)構(gòu)體類型,取名FILE,謂之文件類型,其定義放在stdio.h頭文件中。

typedefstruct

{int_fd;

/*文件號*/

int_cleft;

/*緩沖區(qū)中剩下的字符*/

int_mode;

/*文件操作模式*/

char*_nextc;

/*文件當(dāng)前位置*/

char*_buff;}FILE;/*文件緩沖區(qū)位置*/

?FILE類型指針

包含了stdio.h頭文件就可用FILE來定義文件類

型的指針變量。

如:FILE*fp;

可以使fp指向某一文件的結(jié)構(gòu)體變量,從而可通過該結(jié)構(gòu)體變量中的各項(xiàng)信息來實(shí)現(xiàn)對該文件的操作。一個文件指針用來操作一個文件。如有n個文件,一般應(yīng)定義n個文件類型指針變量來分別指向n

個文件。10.3文件的打開和關(guān)閉1.文件打開函數(shù)fopen()

FILE*fopen(char*filename,char*mode)

調(diào)用時:

?filename(文件名)為要打開文件的文件名(字符串),可寫成:"test.dat"

或定義過chars[]="test.dat";則寫s;

或定義過char*pc="test.dat";則寫pc;

或定義過#defineff"test.dat";則寫ff。

?mode為文件使用方式或稱打開方式,可以是:"r"

—只讀,為輸入打開一個文本文件;"w"—只寫,為輸出打開一個文本文件;"a"—追加,向文本文件尾追加數(shù)據(jù);"rb"

—只讀,為輸入打開一個二進(jìn)制文件;"wb"—只寫,為輸出打開一個二進(jìn)制文件;"ab"—追加,向二進(jìn)制文件尾追加數(shù)據(jù);"r+"—讀寫,為讀/寫打開一個文本文件;"w+"—讀寫,為讀/寫建立一個新文本文件;"a+"—讀寫,為讀/寫(追加)打開一個文本文件。

?打開文件常用如下語句:if((fp=fopen("file1.dat","r"))==NULL)

{printf("cannotopenthisfile.\n");

exit();}

如果調(diào)用fopen()成功,返回一文件類型指針,否則返回一空指針。其中exit()是個進(jìn)程控制庫函數(shù),其作用是關(guān)閉所有文件,終止程序運(yùn)行。格式為:

voidexit(intstatus)2.文件關(guān)閉函數(shù)fclose()

格式:intfclose(FILE*fp)

如果文件關(guān)閉成功,返回0,如檢測到任何錯誤,則返回EOF(即-1,在頭文件stdio.h中定義)。10.4文件的輸入和輸出10.4.1讀寫一個字符的函數(shù)—fgetc()和fputc()1.fgetc()函數(shù)格式:intfgetc(FILE*fp)

功能:從一打開的文件中讀一個字符,返回該字符。文件中有一個指向當(dāng)前位置的指針自動后移一個字符。反復(fù)調(diào)用可一直讀到文件結(jié)束。文件結(jié)束或出錯時,返回EOF。C語言提供了一個檢測文件結(jié)束函數(shù):

intfeof(FILE*fp)

如果文件結(jié)束,返回非0值,否則返回0?!纠?.1】設(shè)計(jì)程序讀一個源程序文件,并在屏幕上顯示。源程序文件名為:“c:\tc\hello.c”。#include"stdio.h"main(){FILE*fp;charch;if((fp=fopen("c:\\tc\\hello.c","r"))==NULL){printf("cannotopenthisfile.\n");exit();}

ch=fgetc(fp);

while(feof(fp)==0){putchar(ch);ch=fgetc(fp);}fclose(fp);}其中:

ch=fgetc(fp);

while(feof(fp)==0){putchar(ch);ch=fgetc(fp);}

也可寫成:

while(!feof(fp)){ch=fgetc(fp);putchar(ch);}

或:

while((ch=fgetc(fp))!=EOF)putchar(ch);2.fputc()函數(shù)格式:intfputc(charch,FILE*fp)

功能:將字符ch寫到fp指向的文件中去,成功,則返回該字符,否則返回EOF?!纠?.2】將字符串“WelcomeFleshman!”寫入c:\tc下名為“file1.dat”的磁盤文件中。#include"stdio.h"main(){FILE*fp;charch;if((fp=fopen("c:\\tc\\file1.dat","w"))==NULL){printf("cannotopenthisfile.\n");exit();}while((ch=getchar())!='\n')

fputc(ch,fp);fclose(fp);}

運(yùn)行時輸入:WelcomeFleshman!例:復(fù)制一個磁盤文件。#include"stdio.h"main(){FILE*in,*out;

charch,infile[10],outfile[10];

printf("Entertheinfilename:\n";gets(infile);

printf("Entertheoutfilename:\n";gets(outfile);if((in=fopen(infile,"r"))==NULL){printf("cannotopeninfile.\n");exit();}

if((out=fopen(outfile,"r"))==NULL){printf("cannotopenoutfile.\n");exit();}while(!feof(in))

fputc(fgetc(in),out);

fclose(in);

fclose(out);}10.4.2塊讀寫函數(shù)—fread()和fwrite()格式:

intfread(void*buf,intsize,intn,FILE*fp)intfwrite(void*buf,intsize,intn,FILE*fp)其中:void*buf:任何類型指向數(shù)據(jù)塊(首址)的指針,intsize:要讀寫的數(shù)據(jù)塊字節(jié)數(shù),intn:

要讀寫的數(shù)據(jù)塊個數(shù),F(xiàn)ILE*fp:

指向已打開的要讀寫文件的指針。讀或?qū)懗晒Γ祷刈x或?qū)憯?shù)據(jù)塊個數(shù)功能:從fp指定的文件讀取或?qū)懭腴L度為size的n個數(shù)據(jù)塊,存到或取自buf所指向的內(nèi)存區(qū)。例:建一函數(shù),把上一章舉例的學(xué)生數(shù)據(jù)鏈表的內(nèi)容存入文件。voidsave(structstudent*head,FILE*fp){structstudent*p;for(p=head;p;p=p->next)fwrite(p,sizeof(*p),1,fp);}【例7.3】設(shè)職工數(shù)據(jù)為:工號、姓名、性別、年齡、工資,將6名職工的數(shù)據(jù)從鍵盤輸入,然后送入磁盤文件worker1.rec中保存。再讀此文件并輸出這些數(shù)據(jù),依次打印出來。#include<stdio.h>#defineSIZE6structworker_type{intnum,age;charname[10],sex;floatpay;}worker[SIZE];voidsave(){FILE*fp;inti;if((fp=fopen("worker1.rec","wb"))==NULL){printf("Cannotopenfile.\n");exit();}for(i=0,i<SIZE;i++){if(fwrite(&worker[i],sizeof(structworker_type),1,fp)!=1)

printf("filewriteerror.\n");}

fclose(fp);}main(){inti;FILE*fp;for(i=0;i<SIZE;i++)

scanf("%d%s%c%d%f",&worker[i].num,

worker[i].name,&worker[i].sex,

&worker[i].age,

&worker[i].pay);save();printf("\nNoNameSexAgePay\n");

fp=fopen("worker1.rec","rb");

for(i=0;i<SIZE;i++)

{

fread(&worker[i],sizeof(struct

worker_type),1,fp);

printf("%5d%-8s%-5c%-5d%6.2f\n",

worker[i].num,worker[i].name,worker[i].sex,

worker[i].age,worker[i].pay);

}}輸入和輸出結(jié)果見p.154例(填空):以下程序把從鍵盤讀入的10個整數(shù)以二進(jìn)制方式寫到一個名為bi.dat的新文件中。#include<stdio.h>FILE*fp;main(){inti,j;if((fp=fopen(______,"wb"))==NULL)

exit(0);for(i=0;i<10;i++)

{scanf("%d",&j);fwrite(&j,_________,1,__);}

fclose(fp);}"bi.dat"fpsizeof(int)10.4.3

其他讀寫函數(shù)1.字符串讀寫函數(shù)

?讀字符串函數(shù)格式:char*fgets(char*string,intn,FILE*fp)

功能:從fp指定的文件讀取長度為n-1的字符串存入起始地址為string的內(nèi)存空間,自動加結(jié)束標(biāo)志'\0',共占n個字符,返回值為地址string。

若在未讀足n-1個字符前遇到換行符'\n'或文件結(jié)束就停止讀取。若讀到文件末尾或出錯,則返回NULL值。?寫字符串函數(shù)格式:

int

fputs(char*string,FILE*fp)

其中string可以是字符串常量,字符數(shù)組名

或字符指針。功能:將string指向的字符串寫到fp指定的文件。但不輸出字符串結(jié)束符。寫成功,則返回所寫的最后一個字符,否則返回EOF值。例(填空):從鍵盤上輸入一個字符串,把其中的小寫字母改成大寫,輸出到文件test.txt中,然后從該文件讀出此字符串并顯示。#include<stdio.h>

main(){FILE*fp;charstr[100];inti=0;gets(str);if((fp=fopen("test.txt",_____))==NULL){printf("Can'topenthisfile.\n");exit(0);}

while(str[i])

{if(str[i]>='a'&&str[i]<='z')

str[i]=______;

fputc(str[i],fp);i++;}fclose(fp);

fp=fopen("test.txt",_____);

fgets(str,100,fp);printf("%s\n",str);fclose(fp);}"w""r"str[i]-322.格式化讀寫函數(shù)?調(diào)用格式:

fscanf(FILE*fp,格式說明,輸入表列)

fprintf(FILE*fp,格式說明,輸出表列)?說明:

這兩個函數(shù)與scanf()和printf()

相似,只是讀寫對象不同,前者是文件,后者是終端。

這兩個函數(shù)讀寫的是文本文件。【例7.5】有一封英文信,其文件名為:letter.txt。統(tǒng)計(jì)信中大寫字母的個數(shù),句子的總數(shù)。#include<stdio.h>main(){FILE*fp;charc;intk,m;if((fp=fopen("letter.txt","r"))==NULL){printf("cannotopenthisfile.\n");exit();}k=m=0;while(fscanf(fp,"%c",&c)!=EOF)

{if(c<='Z'&&c>='A')k++;/*k統(tǒng)計(jì)大寫字母*/

if(c=='.')m++;/*m統(tǒng)計(jì)句子*/

printf("%c",c);}

printf("Capitalletternumbers:%d\n",k);printf("Sentencenumbers:%d\n",m);fclose(fp);}上機(jī)實(shí)驗(yàn)9一個班級有n個學(xué)生,每個學(xué)生有學(xué)號、姓名和三門課的成績。要求編程實(shí)現(xiàn)以下的功能:1)輸入n,再依次輸入n個學(xué)生的信息

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論