版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第13章文件操作長春理工大學(xué)計算機(jī)科學(xué)技術(shù)學(xué)院孫爽滋本章學(xué)習(xí)內(nèi)容二進(jìn)制文件和文本文件文件的翻開和關(guān)閉文件的順序讀寫與隨機(jī)讀寫標(biāo)準(zhǔn)輸入輸出及其重定向問題的提出1.程序運(yùn)行時,需大批量輸入數(shù)據(jù),假設(shè)輸入有錯誤,該怎么辦?如:對N個整數(shù)進(jìn)行排序2.程序的運(yùn)行結(jié)果想存留下來〔不止是屏幕顯示〕,該如何處理?3.操作目標(biāo)本身就針對一個文檔時,如對一個文檔進(jìn)行檢索,是否存在“敏感詞”。示例對一重要、私密文件進(jìn)行加密/解密處理。方法一:加密程序+解密程序方法二:加密/解密演示加密程序演示解密程序演示加密/解密程序文件〔File〕文件一般指存儲在外部介質(zhì)上有名字的一組相關(guān)數(shù)據(jù)的集合用文件可長期保存數(shù)據(jù),實(shí)現(xiàn)數(shù)據(jù)共享在C語言中,文件可泛指磁盤文件、終端顯示器或打印機(jī)……程序中的文件在程序運(yùn)行時由程序在磁盤上建立一個文件,通過寫操作將數(shù)據(jù)存入該文件由程序翻開磁盤上的某個已有文件,并通過讀操作將文件中的數(shù)據(jù)讀入內(nèi)存供程序使用文件的存放〔Storage〕可以建立假設(shè)干文件目錄(directory\folder文件夾)在目錄里保存文件同一級目錄里保存的文件不能同名對使用者而言,只要知道文件的路徑(path,全目錄)和文件名,就能使用該文件D:\home\Sunner\main.c這都是托OS的福13.1二進(jìn)制文件和文本文件
文件的類型〔TypeofFiles〕?二進(jìn)制文件是一種字節(jié)序列,沒有字符變換按照數(shù)據(jù)在內(nèi)存中的存儲形式〔二進(jìn)制〕存儲到文件如整數(shù)123,在內(nèi)存占2個字節(jié),那么文件中也占2個字節(jié)文本文件/ASCII碼文件是一種字符序列,文件中存儲每個字符的ASCII碼如整數(shù)123在文件中占3個字節(jié),分別存放這3個字符的ASCII碼文件的格式〔FormatofFiles〕數(shù)據(jù)必須按照存入的類型讀出,才能恢復(fù)其本來面貌公開的標(biāo)準(zhǔn)格式如bmp、tif、gif、jpg和mp3等類型的文件,有大量軟件能生成和使用這些類型的文件不公開或加密的文件格式如MicrosoftWord的doc格式就不公開,所以至今沒有Word以外的其他軟件能完美地讀出doc文件
緩沖型和非緩沖型文件系統(tǒng)
緩沖型文件系統(tǒng)指系統(tǒng)自動在內(nèi)存中為每一個正在使用的文件開辟一個緩沖區(qū),在讀寫文件時,數(shù)據(jù)先送到緩沖區(qū),再傳給C程序或外存上非緩沖型文件系統(tǒng)不會自動設(shè)置文件緩沖區(qū),緩沖區(qū)需由程序員自己設(shè)定13.2文件的翻開和關(guān)閉下面介紹的函數(shù)均定義在<stdio.h>中FILE*fopen(constchar*filename,constchar*mode);FILE*fp=fopen("D:\\A.TXT","r");filename是文件名包含路徑。如果不含路徑,表示翻開當(dāng)前目錄下的文件mode是翻開方式常用為"r"、"w"、"rw"和"a",分別表示只讀、只寫、讀寫和添加,"rb"表示只讀二進(jìn)制文件返回值為指向此文件的指針,留待以后使用如果翻開失敗,返回值為NULL
mode:對應(yīng)二進(jìn)制文件“r”
只讀必須是已存在的文件。“w”只寫不論該文件是否存在,都新建一個文件。“a”
追加向文本文件尾增加數(shù)據(jù),該文件必須存在“r+”讀寫打開一個已存在的文件,用于讀寫。“w+”讀寫建立一個新文件,可讀可寫?!癮+”讀寫向文件尾追加數(shù)據(jù),也可讀。“rb”“wb”“ab”“rb+”“wb+”“ab+”對應(yīng)文本文件13.2文件的翻開和關(guān)閉
應(yīng)用舉例FILE*fp;fp=fopen(“e:\\sun.txt”,“w”);FILE*fp;fp=fopen(“temp.c”,“r”);FILE*fp;fp=fopen(“d:\\tc\\temp\\a.dat”,“rb”);FILE*fp;fp=fopen(“play.cpp”,“a”);<練>假設(shè)要翻開E盤上user子目錄下名為abc.txt的文本文件進(jìn)行讀、寫操作,下面符合此要求的函數(shù)調(diào)用是()。 A.fopen(“E:\user\abc.txt","r") B.fopen(“E:\\user\\abc.txt","r+") C.fopen(“E:\user\abc.txt","rb") D.fopen(“E:\\user\\abc.txt","w")13.2文件的翻開和關(guān)閉fopen的返回值假設(shè)不能實(shí)現(xiàn)翻開任務(wù),fopen函數(shù)將帶回一個空指針值NULL(值為0)。常用翻開文件的方法為:if(
(fp=fopen(“a1.txt”,”r”))==NULL){printf(“cannotopenthisfile\n”);
exit(0);}13.2文件的翻開和關(guān)閉#include<stdlib.h>或#include<cstdlib>文件指針〔FilePointer〕FILE
*fp;是FILE型指針變量,標(biāo)識一個特定的磁盤文件typedef
struct{
shortlevel;/*緩沖區(qū)‘滿’或‘空’的程度*/
unsignedflags;/*文件狀態(tài)標(biāo)志*/
charfd;/*文件描述符*/
unsignedcharhold;/*如無緩沖區(qū)不讀字符*/
shortbsize;/*緩沖區(qū)的大小*/
unsignedchar*buffer;/*數(shù)據(jù)緩沖區(qū)的位置*/
unsignedchar*curp;/*指針當(dāng)前的指向*/
unsignedistemp;/*臨時文件指示器*/
shorttoken;/*用于有效性檢查*/}FILE;/*在stdio.h文件中定義*/13.2文件的翻開和關(guān)閉intfclose(FILE*fp);把遺留在緩沖區(qū)中的數(shù)據(jù)寫入文件,實(shí)施操作系統(tǒng)級的關(guān)閉操作同時,釋放與流聯(lián)系的文件控制塊,以后可以重復(fù)使用這局部空間多數(shù)情況下,系統(tǒng)限制同時處于翻開狀態(tài)的文件總數(shù),因此,翻開文件前先關(guān)閉無用文件是必要的fclose函數(shù)的返回值當(dāng)順利地執(zhí)行了關(guān)閉操作,返回值為0如果返回值為非零值,表示關(guān)閉時有錯誤一般只有驅(qū)動器中無盤或盤空間不夠時才失敗,關(guān)閉失敗會引起數(shù)據(jù)喪失、文件的破壞和程序中的隨機(jī)錯誤一般使用:FILE*fp;fp=fopen("e:\\a.txt","r"); ······ ······ fclose(fp);13.3按字符讀寫文件字符讀寫intfgetc(FILE*fp);從fp讀出一個字符,將位置指針指向下一個字符假設(shè)讀成功,那么返回該字符,假設(shè)讀到文件尾,那么返回EOF(EOF是一個符號常量,在stdio.h中定義為-1)intfputc(intc,FILE*fp);向fp輸出字符c假設(shè)寫入錯誤,那么返回EOF,否那么返回c13.3按字符讀寫文件【例13.1】從鍵盤輸入一串字符,轉(zhuǎn)存到磁盤文件上為什么要判斷文件打開是否成功呢?
【例13.2】將0~127之間的ASCII字符寫到文件中,然后從文件中讀出并顯示到屏幕上文本文件判斷是否是文件尾,用EOF<例>分析程序的功能。
判斷二進(jìn)制文件是否結(jié)束——feof函數(shù)
。
#include<stdio.h>main(){FILE*in,*out;charch;
in=fopen(“e:\\sun\\abc.txt”,"rb");out=fopen(“e:\\sun\\abc.bak”,"wb");
while(!feof(in)){ch=fgetc(in);fputc(ch,out);}fclose(in);
fclose(out);}fputc(fgetc(in),out);函數(shù)feof()檢查是否到達(dá)文件尾,當(dāng)文件位置指針指向文件尾時,返回非0值,否那么返回0值
判斷文本文件是否結(jié)束——用EOF宏名。
二進(jìn)制文件拷貝<練>.下面的程序執(zhí)行后,文件test.t中的內(nèi)容是()。
#include<stdio.h>
voidfun(char*fname.,char*st)
{FILE*myf;inti;myf=fopen(fname,"w");
for(i=0;i<strlen(st);i++)fputc(st[i],myf);
fclose(myf);
}main()
{fun("test.t","newworld");fun("test.t","hello,");}
A.hello,B.newworldhello,
C.newworldD.hello,rld<練>.08年4月國二考題以下程序從名為filea.dat的文本文件中逐個讀入字符并顯示在屏幕上。請?zhí)羁眨?/p>
#include<stdio.h>
main()
{FILE*fp;charch;
fp=fopen(【】);
ch=fgetc(fp);
whlie(!feof(fp)){putchar(ch);ch=fgetc(fp);}
putchar(‘\n’);fclose(fp);}
“filea.dat","r"
<練>2012年9月國二考題對于下述程序,在方式串分別采用"w+"和"wb"運(yùn)行時,兩次生成的文件TEST的長度分別是〔〕。#include<stdio.h>voidmain(){FILE*fp=fopen(“TEST”,【翻開方式】);fputc(′A′,fp);fputc(′\n′,fp);fputc(′B′,fp);fputc(′\n′,fp);fputc(′C′,fp);fclose(fp);}
A)7字節(jié)、7字節(jié)B)7字節(jié)、5字節(jié)C)5字節(jié)、7字節(jié)D)5字節(jié)、5字節(jié)B
文本文件:’\n’
磁盤存儲時分別為:\和n,占兩個字節(jié)。內(nèi)存中:為一個字符(字節(jié))。二進(jìn)制文件:’\n’磁盤存儲和內(nèi)存是一致的,都為一個字符(字節(jié))。13.4按格式讀寫文件格式化讀寫intfscanf(FILE*fp,const
char*format,...);fscanf(fp,"%d,%f",&i,&t);第1個參數(shù)為文件指針,第2個參數(shù)為格式控制參數(shù),第3個參數(shù)為地址參數(shù)表列intfprintf(FILE*fp,const
char*format,...);fprintf(fp,"%d,%6.2f",i,t);第1個參數(shù)為文件指針,第2個參數(shù)為格式控制參數(shù),第3個參數(shù)為輸出參數(shù)表列<例>讀程序,寫結(jié)果。#include<stdio.h>main(){FILE*fp;inti=5;floatx=3.14;
fp=fopen(“e:\\exam.txt”,“w”);
fprintf(fp,“i=%d,x=%f”,i,x);fclose(fp);}<例>讀程序,寫結(jié)果。#include<stdio.h>main(){FILE*fp;inti=5;floatx=3.14;fp=fopen(“e:\\exam.txt”,“w”);printf(“i=%d,x=%f”,i,x);fclose(fp);}輸出重定向<例>讀程序,寫結(jié)果。#include<stdio.h>main(){FILE*fp;inti;floatx;fp=fopen(“e:\\exam.txt”,“r”);fscanf(fp,“%d%f”,&i,&x);printf(“i=%d,x=%f”,i,x);fclose(fp);}假定,e盤下有一文件exam.txt,內(nèi)容為:23.5fscanf(fp,“%d,%f”,&i,&x);假設(shè)換成此語句,程序結(jié)果會怎樣?<練>.09年3月國二考題有以下程序#include<stdio.h>main(){ FILE*f; f=fopen("filea.txt","w"); fprintf(f,"abc"); fclose(f);}假設(shè)文本文件filea.txt中的原有內(nèi)容為:hello,那么運(yùn)行以上程序后,文件filea.txt中的內(nèi)容為()。A.helloabc B.abclo C.abcD.abchello<練>.08年4月國二考題#include<stdio.h>
main()
{FILE*fp;inta[10]={1,2,3},i,n;
fp=fopen(“dl.dat”,”w”);
for(i=0;i<3;i++)
fprintf(fp,”%d”,a[i]);
fprintf(fp,”\n”);
fclose(fp);
fp=fopen(“dl.dat”,”r”);
fscanf(fp,”%d”,&n);
fclose(fp);
printf(“%d\n”,n);
}
程序的運(yùn)行結(jié)果是:A)12300B)123C)1 D)321<練>.程序運(yùn)行后的輸出結(jié)果是()。#include<stdio.h>main(){FILE*fp;inti=20,j=30,k,n;fp=fopen〔"d1.dat","w"〕;fprintf(fp,"%d\n",i);fprintf(fp,"%d\n",j);fclose(fp);fp=fopen("d1.dat","r");fp=fscanf(fp,"%d%d",&k,&n);printf("%d%d\n",k,n);fclose(fp);}A.2030B.2050 C.3050 D.302013.5按數(shù)據(jù)塊讀寫文件按數(shù)據(jù)塊讀寫fread(buff,size,count,fp)待讀文件的數(shù)據(jù)在內(nèi)存中的起始地址從文件讀入的每個數(shù)據(jù)項的字節(jié)數(shù)從文件讀入的數(shù)據(jù)項數(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);#include<stdio.h>main(){charc;FILE*fp;fp=fopen(“e:\\sun\\a.txt”,”wb”);for(c=‘a(chǎn)’;c<=‘z’;c++)
fwrite(&c,1,1,fp);fclose(fp);}<例>分析程序的功能。<練>08年9月國二考題#include<stdio.h>main(){ FILE*pf; char*s1="China",*s2="Beijing"; pf=fopen("abc.dat","wb+"); fwrite(s2,7,1,pf);
rewind(pf);/*文件位置指針回到文件頭*/ fwrite(s1,5,1,pf); fclose(pf);}以上程序執(zhí)行后abc.dat文件的內(nèi)容是:A.China B.Chinang C.ChinaBeijing D.BeijingChina10.6.1文件的隨機(jī)讀寫文件指針:翻開的文件中有一個位置指針指示動遷的讀寫位置,對文件每進(jìn)行一次讀寫,文件指針自動指向下一個讀寫位置,那么可方便地進(jìn)行順序讀寫,利用定位函數(shù)還可實(shí)現(xiàn)隨機(jī)讀寫.rewind()函數(shù)功能:使文件指針重新指向文件的開頭位置。此函數(shù)沒有返回值形式:rewind(fp)
fp為指向fopen函數(shù)翻開的文件的指針。<例>
對一個磁盤文件進(jìn)行顯示和復(fù)制兩次操作#include<stdio.h>main(){FILE*fp1,*fp2;charch;fp1=fopen("d:\\sun\\a.txt","r");fp2=fopen("d:\\sun\\aa.bak","w");while((ch=fgetc(fp1))!=EOF)
putchar(ch);
rewind(fp1);while((ch=fgetc(fp1))!=EOF)
fputc(ch,fp2);
fclose(fp1);fclose(fp2);}fp:為指向fopen函數(shù)翻開的文件的指針;offset:文件指針的位移量,字節(jié)數(shù),long型,加l或L;from:起始位置
fseek()函數(shù):利用該函數(shù)可以改變文件指針的位置,從而實(shí)現(xiàn)隨機(jī)讀寫形式:fseek(fp,offset,from);位移量〔以起始點(diǎn)為基點(diǎn),移動的字節(jié)數(shù))>0向后移動<0向前移動例fseek(fp,100L,0);fseek(fp,50L,1);fseek(fp,-10L,2);10.6.1文件的隨機(jī)讀寫起始點(diǎn)文件開始
SEEK_SET0文件當(dāng)前位置
SEEK_CUR1文件末尾
SEEK_END2rewind〔〕函數(shù):fseek()函數(shù):
ftell()函數(shù):取得文件指針的當(dāng)前位置,用字節(jié)數(shù),long類型。10.6.1文件的隨機(jī)讀寫#include"stdio.h"main(){FILE*fp;longlength;fp=fopen(“e:\\sun\\a.txt”,"r");if(fp==NULL)printf("filenotfound!\n");else{fseek(fp,0L,SEEK_END);length=ftell(fp);printf("LengthofFileis%1dbytes\n",length);
fclose(fp);}}<例>分析程序功能。求文件長度<練習(xí)>以下程序的功能是()。#include<stdio.h>main(){FILE*fp;fp=fopen(“abc.txt","r+");while(!feof(fp))if(fgetc(fp)==’*’)
{fseek(fp,-1L,SEEK_CUR);
fputc(‘$’,fp);
fseek(fp,ftell(fp),SEEK_SET);}fclose(fp);}A.將abc文件中所有’*’替換為’$’B.查找abc文件中所有’*’C.查找abc文件中所有’$’D.將abc文件中所有字符替換為’$’計算機(jī)根底教學(xué)部<例>文件加密程序。將一文本文件進(jìn)行簡單加密。加密算法是:文件中的字符如果是字母,將其按字母表的順序加4處理,如果是其他字符,那么原內(nèi)容不改變。如,有一文本文件mine.txt,內(nèi)容如下:COUNT:xyzPASSWORD:1234567該文件加密后:GSYRX:bcdTEWWASVH:1234567ABCDEFGHIJKLMNOPQRSTUVWXYZ#include<stdio.h>main(){FILE*fp;charch;fp=fopen(“e:\\sun\\mine.txt","r+");while((ch=fgetc(fp))!=EOF){if(ch>=‘a(chǎn)’&&ch<=‘z’||ch>=‘A’&&ch<=‘Z’){ch+=4;if(ch>’z’||ch>‘Z’&&ch<=‘Z’+4)ch-=26;
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 三年級下冊數(shù)學(xué)教學(xué)工作計劃進(jìn)度安排
- 《研究生單招復(fù)習(xí)題》課件
- 《園林及植物配置》課件
- 藝術(shù)場館經(jīng)濟(jì)效益評估-洞察分析
- 眼眶減壓術(shù)研究-洞察分析
- 塑料原料供應(yīng)風(fēng)險應(yīng)對-洞察分析
- 語義相似度度量模型-洞察分析
- 虛擬現(xiàn)實(shí)手術(shù)模擬-第2篇-洞察分析
- 隱私保護(hù)增強(qiáng)學(xué)習(xí)-洞察分析
- 虛擬環(huán)境下的保險理賠調(diào)查-洞察分析
- MOOC創(chuàng)新創(chuàng)業(yè)與管理基礎(chǔ)(東南大學(xué))
- 快速出具舊機(jī)動車評估報告
- 人員保有培訓(xùn)課件
- 中職課程思政說課比賽 課件
- 臺大歐麗娟《紅樓夢》公開課全部筆記
- 公司報價管理辦法
- 農(nóng)貿(mào)市場安全生產(chǎn)風(fēng)險分級管控和隱患排查治理雙體系方案全套資料2019-2020完整實(shí)施方案模板
- 人教版 五年級上冊道德與法治全冊各課及單元同步檢測試卷【含答案】
- T梁濕接縫及橫隔梁施工方案
- 掛籃檢查驗收記錄表
- 小學(xué)勞動教育培訓(xùn)心得體會
評論
0/150
提交評論