版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
10、文件10.1概述?
文件是存儲在外部介質(zhì)上的數(shù)據(jù)的集合,由操作系統(tǒng)來管理。最常用的是磁盤文件。?從文件數(shù)據(jù)的組織形式可分為文本文件和二進制文件。
源程序文件一般是文本文件
數(shù)據(jù)文件可是文本文件,也可是二進制文件?C語言把文件都看作“字節(jié)流”文件,也稱“流式文件”,對文件的讀寫是以字節(jié)為單位的。
C語言中的文本文件的每個字節(jié)代表一個字符,存放的是該字符的ASCII碼
C語言中的二進制文件是把數(shù)據(jù)按其在內(nèi)存中的存儲形式照原樣輸出到磁盤上?C語言中對文件處理的方法可分為兩種:
緩沖文件系統(tǒng)系統(tǒng)自動為打開的文件開辟其各自的內(nèi)存緩沖區(qū),本章介紹的文本文件和二進制文件都屬此種非緩沖文件系統(tǒng)系統(tǒng)不自動開辟內(nèi)存緩沖區(qū),而由用戶根據(jù)需要在程序中設定10.2文件類型(FILE)指針?FILE類型處理一個文件須知它的各種信息,這些信息由系統(tǒng)將其構(gòu)成一個結(jié)構(gòu)體類型,取名FILE,謂之文件類型,其定義放在stdio.h頭文件中。
typedefstruct
{int_fd;
/*文件號*/
int_cleft;
/*緩沖區(qū)中剩下的字符*/
int_mode;
/*文件操作模式*/
char*_nextc;
/*文件當前位置*/
char*_buff;}FILE;/*文件緩沖區(qū)位置*/
?FILE類型指針
包含了stdio.h頭文件就可用FILE來定義文件類
型的指針變量。
如:FILE*fp;
可以使fp指向某一文件的結(jié)構(gòu)體變量,從而可通過該結(jié)構(gòu)體變量中的各項信息來實現(xiàn)對該文件的操作。一個文件指針用來操作一個文件。如有n個文件,一般應定義n個文件類型指針變量來分別指向n
個文件。10.3文件的打開和關閉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"
—只讀,為輸入打開一個二進制文件;"wb"—只寫,為輸出打開一個二進制文件;"ab"—追加,向二進制文件尾追加數(shù)據(jù);"r+"—讀寫,為讀/寫打開一個文本文件;"w+"—讀寫,為讀/寫建立一個新文本文件;"a+"—讀寫,為讀/寫(追加)打開一個文本文件。
?打開文件常用如下語句:if((fp=fopen("file1.dat","r"))==NULL)
{printf("cannotopenthisfile.\n");
exit();}
如果調(diào)用fopen()成功,返回一文件類型指針,否則返回一空指針。其中exit()是個進程控制庫函數(shù),其作用是關閉所有文件,終止程序運行。格式為:
voidexit(intstatus)2.文件關閉函數(shù)fclose()
格式:intfclose(FILE*fp)
如果文件關閉成功,返回0,如檢測到任何錯誤,則返回EOF(即-1,在頭文件stdio.h中定義)。10.4文件的輸入和輸出10.4.1讀寫一個字符的函數(shù)—fgetc()和fputc()1.fgetc()函數(shù)格式:intfgetc(FILE*fp)
功能:從一打開的文件中讀一個字符,返回該字符。文件中有一個指向當前位置的指針自動后移一個字符。反復調(diào)用可一直讀到文件結(jié)束。文件結(jié)束或出錯時,返回EOF。C語言提供了一個檢測文件結(jié)束函數(shù):
intfeof(FILE*fp)
如果文件結(jié)束,返回非0值,否則返回0?!纠?.1】設計程序讀一個源程序文件,并在屏幕上顯示。源程序文件名為:“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。【例7.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);}
運行時輸入:WelcomeFleshman!例:復制一個磁盤文件。#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ū)懗晒?,返回讀或?qū)憯?shù)據(jù)塊個數(shù)功能:從fp指定的文件讀取或?qū)懭腴L度為size的n個數(shù)據(jù)塊,存到或取自buf所指向的內(nèi)存區(qū)。例:建一函數(shù),把上一章舉例的學生數(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ù)據(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ù)以二進制方式寫到一個名為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é)束標志'\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ù)讀寫的是文本文件?!纠?.5】有一封英文信,其文件名為:letter.txt。統(tǒng)計信中大寫字母的個數(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)計大寫字母*/
if(c=='.')m++;/*m統(tǒng)計句子*/
printf("%c",c);}
printf("Capitalletternumbers:%d\n",k);printf("Sentencenumbers:%d\n",m);fclose(fp);}上機實驗9一個班級有n個學生,每個學生有學號、姓名和三門課的成績。要求編程實現(xiàn)以下的功能:1)輸入n,再依次輸入n個學生的信息
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年國投航空科技(北京)有限公司招聘備考題庫完整答案詳解
- 2026年國家空間科學中心質(zhì)量管理處招聘備考題庫含答案詳解
- 2026年天津市醫(yī)源衛(wèi)生人才服務有限責任公司公開招聘工作人員的備考題庫及一套參考答案詳解
- 2026年天津市醫(yī)源衛(wèi)生人才服務有限責任公司公開招聘工作人員的備考題庫及1套完整答案詳解
- 2026年中建新科建設發(fā)展有限公司招聘備考題庫完整答案詳解
- 2026年北京協(xié)和醫(yī)院神經(jīng)科合同制科研助理招聘備考題庫及答案詳解一套
- 2026年天津市靜海區(qū)所屬部分國有企業(yè)面向社會公開招聘工作人員備考題庫及參考答案詳解一套
- 2026年1112月山東圣翰財貿(mào)職業(yè)學院韓語教師招聘備考題庫及答案詳解一套
- 2026年上海對外經(jīng)貿(mào)大學招聘工作人員備考題庫參考答案詳解
- 2026年哈爾濱電機廠有限責任公司招聘備考題庫及1套參考答案詳解
- (二模)大慶市2026屆高三第二次教學質(zhì)量檢測英語試卷
- 2025至2030中國高級計劃和排程(APS)軟件行業(yè)調(diào)研及市場前景預測評估報告
- 企業(yè)管理-礦石行業(yè)賬務處理工作流程 SOP
- 民航上海醫(yī)院2025年度公開招聘工作人員參考題庫附答案
- 2025年萍鄉(xiāng)市公安局公開招聘警務輔助人員【36人】考試備考題庫及答案解析
- 醫(yī)院護理科2026年度工作總結(jié)與2026年度工作計劃(完整版)
- 新疆農(nóng)林牧特色課件
- 安徽省A10聯(lián)盟2025-2026學年高三上學期12月學情檢測化學試題(含答案)
- 辣椒訂協(xié)議書范本
- 萬科物業(yè)安全管理方案
- 國資與私有企業(yè)合作運營案例分享
評論
0/150
提交評論