




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第9章
文件目錄文件基本概念文件打開(kāi)與關(guān)閉文件讀寫文件重定向216:12為什么要使用文件變量和數(shù)組是程序運(yùn)行過(guò)程中分配的內(nèi)存空間,該空間在程序運(yùn)行結(jié)束后被完全釋放。在實(shí)際的程序設(shè)計(jì)中,往往需要長(zhǎng)期保存程序處理后的數(shù)據(jù)。文件是存儲(chǔ)在外存上的有名字的一系列相關(guān)數(shù)據(jù)的有序集合,C/C++正是通過(guò)文件實(shí)現(xiàn)數(shù)據(jù)共享和持久化存儲(chǔ)。文件不僅是操作系統(tǒng)管理數(shù)據(jù)的基本單位,同時(shí)也是程序?qū)?shù)據(jù)進(jìn)行讀寫操作的基本對(duì)象。316:121.文件基本概念C/C++中任一文件均對(duì)應(yīng)唯一的文件標(biāo)識(shí),文件標(biāo)識(shí)由文件路徑、文件名、和文件后綴三個(gè)部分組成:文件路徑表示文件所處的外存目錄;文件名遵循標(biāo)識(shí)符的命名規(guī)則;文件后綴表示文件的性質(zhì)。為簡(jiǎn)便起見(jiàn),在不引起混淆的情況下,通常以文件名指代文件標(biāo)識(shí)。根據(jù)文件中數(shù)據(jù)組織形式的不同,文件可分為文本文件和二進(jìn)制文件。(1)文本文件以字符為基本單位處理數(shù)據(jù),每個(gè)ASCII碼值對(duì)應(yīng)一個(gè)字節(jié),每個(gè)字節(jié)表示一個(gè)字符。故文本文件是字符序列文件,也稱作字符文件或ASCII文件。(2)二進(jìn)制文件把數(shù)據(jù)按對(duì)應(yīng)的二進(jìn)制形式存儲(chǔ),是字節(jié)序列文件。字符數(shù)據(jù)一律以ASCII碼形式存儲(chǔ),數(shù)值型數(shù)據(jù)既可用ASCII碼也可用二進(jìn)制形式存儲(chǔ)。(1)使用ASCII碼存儲(chǔ)時(shí)一個(gè)字節(jié)代表一個(gè)字符,因而便于逐個(gè)處理和輸出字符,但一般占存儲(chǔ)空間較多,而且要花費(fèi)轉(zhuǎn)換時(shí)間(二進(jìn)制形式與ASCII碼間的轉(zhuǎn)換)。(2)使用二進(jìn)制形式存儲(chǔ)可以節(jié)省外存空間和轉(zhuǎn)換時(shí)間,把內(nèi)存單元中的存儲(chǔ)內(nèi)容原封不動(dòng)地輸出到外部介質(zhì),此時(shí)每一個(gè)字節(jié)并不一定代表一個(gè)字符。返回416:12C/C++采用“緩沖文件系統(tǒng)”處理數(shù)據(jù)文件,其特點(diǎn)是系統(tǒng)自動(dòng)在內(nèi)存區(qū)域?yàn)槌绦蛑忻恳粋€(gè)正在使用的文件開(kāi)辟一個(gè)文件緩沖區(qū)。緩沖文件系統(tǒng)為每個(gè)正在使用的文件在內(nèi)存中開(kāi)辟一個(gè)緩沖區(qū),以存放文件的有關(guān)信息,這些信息被保存在一個(gè)FILE結(jié)構(gòu)類型的變量中。struct_iobuf{ char*_ptr; //文件輸入的下一個(gè)位置 int_cnt; //若為輸入緩沖區(qū)則表示其中還剩多少個(gè)字符未被讀取 char*_base; //文件起始位置 int_flag; //文件狀態(tài)標(biāo)志 int_file; //文件有效性驗(yàn)證 int_charbuf; //檢查緩沖區(qū)狀況,若無(wú)緩沖區(qū)則不讀取 int_bufsiz; //文件緩沖區(qū)大小 char*_tmpfname; //臨時(shí)文件名};typedefstruct_iobufFILE;可以用FILE結(jié)構(gòu)體類型來(lái)定義指向文件的指針變量:FILE*fp; //定義一個(gè)指向文件的指針變量fp。注意,指向文件的指針變量并非指向外部存儲(chǔ)介質(zhì)上的數(shù)據(jù)文件的開(kāi)頭,而是指向內(nèi)存中的文件信息區(qū)的開(kāi)頭。516:122.
文件打開(kāi)與關(guān)閉對(duì)文件進(jìn)行讀寫操作前應(yīng)首先打開(kāi)文件,所謂“打開(kāi)文件”是指為文件建立相應(yīng)的信息區(qū)(用來(lái)存放有關(guān)文件的信息)和文件緩沖區(qū)(用來(lái)暫時(shí)存放輸入輸出的數(shù)據(jù))。在編寫程序打開(kāi)文件時(shí),定義一個(gè)文件指針變量指向該文件,之后便可通過(guò)該指針變量對(duì)文件進(jìn)行讀寫操作。打開(kāi)文件使用fopen函數(shù),fopen函數(shù)的原型為:FILE*fopen(char*filename,char*mode);函數(shù)參數(shù):“filename”為包含路徑的文件標(biāo)志,若不顯式指明路徑則表示當(dāng)前路徑。例,“D:\\f1.txt”表示D盤根目錄下的文件f1.txt;“f2.doc”表示當(dāng)前目錄下的文件f2.doc?!癿ode”為文件打開(kāi)模式,指示對(duì)該文件可進(jìn)行的操作:“r”表示只讀,“w”表示只寫,“rw”表示讀寫,“a”表示追加寫入。更多的文件打開(kāi)模式見(jiàn)表9.1。返回6模式含
義說(shuō)
明r只讀文件必須存在,否則打開(kāi)失敗w只寫若文件存在,則清除原文件內(nèi)容后寫入;否則,新建文件后寫入a追加只寫若文件存在,向文件尾部追加寫入;若文件不存在,則打開(kāi)失敗r+讀寫文件必須存在。在只讀“r”的基礎(chǔ)上加'+'表示增加可寫的功能。下同w+讀寫新建一個(gè)文件,先向該文件中寫入數(shù)據(jù),然后可從該文件中讀取數(shù)據(jù)a+讀寫在“a”模式的基礎(chǔ)上,增加可讀功能rb二進(jìn)制讀功能同模式“r”,區(qū)別:“b”表示以二進(jìn)制模式打開(kāi)。下同wb二進(jìn)制寫功能同模式“w”。二進(jìn)制模式ab二進(jìn)制追加功能同模式“a”。二進(jìn)制模式rb+二進(jìn)制讀寫功能同模式“r+”。二進(jìn)制模式wb+二進(jìn)制讀寫功能同模式“w+”。二進(jìn)制模式ab+二進(jìn)制讀寫功能同模式“a+”。二進(jìn)制模式16:12函數(shù)返回值:若打開(kāi)成功,則返回該文件對(duì)應(yīng)的FILE類型的指針;若打開(kāi)失敗,則返回NULL。故需定義FILE類型的指針變量,以保存該函數(shù)的返回值,從而可根據(jù)該函數(shù)的返回值判斷相應(yīng)文件打開(kāi)是否成功。if((fp=fopen("file1","r"))==NULL){ printf("cannotopenthisfile\n"); exit(0);}文件使用結(jié)束后應(yīng)關(guān)閉該文件,以防止對(duì)其誤操作,同時(shí)也避免不關(guān)閉文件就結(jié)束程序運(yùn)行而導(dǎo)致的數(shù)據(jù)丟失。所謂“關(guān)閉文件”是指撤銷文件信息區(qū)和文件緩沖區(qū)。關(guān)閉文件使用fclose函數(shù),fclose函數(shù)的原型為:intfclose(FILE*fp);函數(shù)參數(shù):“fp”為文件指針,指向已打開(kāi)的文件。函數(shù)返回值:若正常關(guān)閉則返回0,否則返回EOF(-1)。716:123.文件讀寫讀寫文件是最常用的文件操作,C/C++提供了多種文件讀寫函數(shù):字符讀寫函數(shù)(fgetc/fputc)字符串讀寫函數(shù)(fgets/fputs)數(shù)據(jù)塊讀寫函數(shù)(fread/fwrite)格式化讀寫函數(shù)(fscanf/fprinf)使用以上函數(shù)時(shí)均要求包含頭文件stdio.h。返回816:123.1字符讀寫函數(shù)fgetc函數(shù)的功能是從指定的文件中讀入一個(gè)字符到內(nèi)存,函數(shù)調(diào)用的形式為:字符變量=fgetc(文件指針);例,“ch=fgetc(fp);”的含義是從打開(kāi)的文件fp中讀取一個(gè)字符并送入ch中。對(duì)于fgetc函數(shù)的使用有以下幾點(diǎn)說(shuō)明:(1)在fgetc函數(shù)調(diào)用中,讀取的文件必須是以讀或讀寫方式打開(kāi)的。(2)讀取字符后可以不向字符變量賦值。例,“fgetc(fp);”代表讀出字符但不作保存。(3)在文件內(nèi)部有一個(gè)位置指針,用來(lái)指向文件的當(dāng)前讀寫字節(jié)。在文件打開(kāi)時(shí),該指針總是指向文件的第一個(gè)字節(jié)。每使用一次fgetc函數(shù)后該位置指針將向后移動(dòng)一個(gè)字節(jié)。應(yīng)注意文件指針和文件內(nèi)部的位置指針不是一回事。文件指針是指向整個(gè)文件的,須在程序中定義說(shuō)明,只要不重新賦值,文件指針的值是不變的。文件內(nèi)部的位置指針用來(lái)指示文件內(nèi)部的當(dāng)前讀寫位置,每讀寫一次該指針均向后移動(dòng),它不需在程序中定義說(shuō)明,而是由系統(tǒng)自動(dòng)設(shè)置。916:129-1讀入文件in.txt,將文件內(nèi)容在屏幕上輸出。#include<iostream>usingnamespacestd;intmain(){ FILE*fp; charch; if((fp=fopen("e:\\in.txt","r"))==NULL){ printf("\nCannotopenfile,pressanykeytoexit!"); exit(1); } while((ch=fgetc(fp))!=EOF) putchar(ch); fclose(fp); return0;}1016:12寫字符函數(shù)fputcfputc函數(shù)的功能是把一個(gè)字符寫出到指定的文件中。函數(shù)調(diào)用的形式為:fputc(字符量,文件指針);其中,待寫入的字符量可以是字符常量或變量,例,“fputc('a',fp);”的含義是把字符'a'寫入fp所指向的文件中。對(duì)于fputc函數(shù)的使用也要說(shuō)明幾點(diǎn):(1)被寫入的文件可以用寫、讀寫、追加方式打開(kāi),用寫或讀寫方式打開(kāi)一個(gè)已存在的文件時(shí)將清除原有的文件內(nèi)容,文件位置標(biāo)記指向文件起始處。(2)如需保留原有文件內(nèi)容,希望寫入的字符從文件末開(kāi)始存放,則須以追加方式打開(kāi)文件。若文件不存在,則創(chuàng)建該文件。(3)每寫入一個(gè)字符,文件內(nèi)部位置指針向后移動(dòng)一個(gè)字節(jié)。(4)執(zhí)行fputc函數(shù)后,若寫入成功則返回寫入的字符,否則返回EOF。1116:129-2從鍵盤輸入一行字符,寫出到文件out.txt,再讀出該文件內(nèi)容顯示在屏幕上。#include<iostream>usingnamespacestd;intmain(){ FILE*fp; charch; if((fp=fopen("e:\\out.txt","w+"))==NULL){ printf("Cannotopenfile,pressanykeytoexit!"); exit(1); } printf("inputastring:\n"); while((ch=getchar())!='\n') fputc(ch,fp); rewind(fp); while((ch=fgetc(fp))!=EOF) putchar(ch); printf("\n"); fclose(fp); return0;}1216:123.2字符串讀寫函數(shù)fgets函數(shù)的功能是從指定的文件中讀入一個(gè)字符串到字符數(shù)組中,函數(shù)調(diào)用的形式為:fgets(字符數(shù)組名,n,文件指針);其中,n是一個(gè)正整數(shù),表示從文件中讀出的字符串不超過(guò)n-1個(gè)字符,在讀入的最后一個(gè)字符后加上串結(jié)束標(biāo)志'\0'。例,“fgets(str,n,fp);”的含義是從fp所指的文件中讀出n-1個(gè)字符,再加上串結(jié)束標(biāo)志'\0'后送入字符數(shù)組str中。1316:129-3從in.txt文件中讀入一個(gè)含10個(gè)字符的字符串。#include<iostream>usingnamespacestd;intmain(){ FILE*fp; charstr[11]; if((fp=fopen("e:\\in.txt","r+"))==NULL){ printf("\nCannotopenfile,pressanykeytoexit!"); exit(1); } fgets(str,11,fp); printf("\n%s\n",str); fclose(fp); return0;}對(duì)fgets函數(shù)有兩點(diǎn)說(shuō)明:(1)在讀出n-1個(gè)字符之前,如遇到了換行符或EOF,則讀出結(jié)束。(2)fgets函數(shù)也有返回值,其返回值是字符數(shù)組的首地址。1416:12寫字符串函數(shù)fputsfputs函數(shù)的功能是將一個(gè)字符串寫出到指定的文件中,其調(diào)用形式為:fputs(字符串,文件指針);其中字符串可以是字符串常量,也可以是字符數(shù)組名,或指針變量。例,“fputs(“abcd“,fp);”是把字符串“abcd”寫入fp所指的文件之中。1516:129-4在例9-2中建立的文件out.txt中追加一個(gè)字符串。#include<iostream>usingnamespacestd;intmain(){ FILE*fp; charch,st[20]; if((fp=fopen("e:\\out.txt","a+"))==NULL){ printf("Cannotopenfile,pressanykeytoexit!"); exit(1); } printf("inputastring:\n"); scanf("%s",st); fputs(st,fp); rewind(fp); while((ch=fgetc(fp))!=EOF) putchar(ch); printf("\n"); fclose(fp); return0;}1616:123.3數(shù)據(jù)塊讀寫函數(shù)C語(yǔ)言還提供了用于整塊數(shù)據(jù)的讀寫函數(shù)。可用來(lái)讀寫一組數(shù)據(jù),如一個(gè)數(shù)組元素,一個(gè)結(jié)構(gòu)變量的值等。讀數(shù)據(jù)塊函數(shù)調(diào)用的一般形式為:fread(buffer,size,count,fp);寫數(shù)據(jù)塊函數(shù)調(diào)用的一般形式為:fwrite(buffer,size,count,fp);其中:buffer:是一個(gè)指針,在fread函數(shù)中,它表示存放輸入數(shù)據(jù)的首地址。在fwrite函數(shù)中,它表示存放輸出數(shù)據(jù)的首地址。size:表示數(shù)據(jù)塊的字節(jié)數(shù)。count:表示要讀寫的數(shù)據(jù)塊塊數(shù)。fp:表示文件指針。1716:129-5從鍵盤輸入兩個(gè)學(xué)生數(shù)據(jù),寫出到文件out.txt中,再讀入這兩個(gè)學(xué)生的數(shù)據(jù)顯示在屏幕上。#include<iostream>usingnamespacestd;structstu{ charname[10]; intnum; intage; charaddr[15];}s1[2],s2[2],*p,*q;intmain(){
FILE*fp; charch; inti; p=s1; q=s2; if((fp=fopen("e:\\out.txt","wb+"))==NULL){ printf("Cannotopenfile,pressanykeytoexit!"); exit(1); } printf("\ninputdata\n"); for(i=0;i<2;i++,p++)scanf("%s%d%d%s",p->name,&p->num,&p->age,p->addr); p=s1; fwrite(p,sizeof(structstu),2,fp); rewind(fp); fread(q,sizeof(structstu),2,fp); printf("\n\nname\tnumber\tage\taddr\n"); for(i=0;i<2;i++,q++)printf("%s\t%d\t%d\t%s\n",q->name,q->num,q->age,q->addr); fclose(fp); return0;}}1816:123.4格式化讀寫函數(shù)fscanf函數(shù)和fprintf函數(shù)與前面使用的scanf和printf函數(shù)的功能相似,都是格式化讀寫函數(shù)。兩者的區(qū)別在于fscanf函數(shù)和fprintf函數(shù)的讀寫對(duì)象不是鍵盤和顯示器,而是磁盤文件。fscanf函數(shù)與fprintf函數(shù)的調(diào)用格式為:fscanf(文件指針,格式字符串,輸入表列);fprintf(文件指針,格式字符串,輸出表列);例如:fscanf(fp,"%d%s",&i,s);fprintf(fp,"%d%c",j,ch);1916:129-6用fscanf和fprintf函數(shù)完成例9-5的問(wèn)題。#include<iostream>usingnamespacestd;structstu{ charname[10]; intnum; intage; charaddr[15];}s1[2],s2[2],*p,*q;intmain(){ FILE*fp; charch; inti; p=s1; q=s2; if((fp=fopen("e:\\out.txt","wb+"))==NULL){ printf("Cannotopenfile,pressanykeytoexit!"); exit(1); } printf("\ninputdata\n"); for(i=0;i<2;i++,p++) scanf("%s%d%d%s",p->name,&p->num,&p->age,p->addr); p=s1; for(i=0;i<2;i++,p++) fprintf(fp,"%s%d%d%s\n",p->name,p->num,p->age,p->addr); rewind(fp); for(i=0;i<2;i++,q++) fscanf(fp,"%s%d%d%s\n",q->name,&q->num,&q->age,q->addr); printf("\n\nname\tnumber\tage\taddr\n"); q=s2; for(i=0;i<2;i++,q++) printf("%s\t%d\t%d\t%s\n",q->name,q->num,q->age,q->addr); fclose(fp); return0;}2016:123.5隨機(jī)讀寫函數(shù)上述文件讀寫函數(shù)均是順序讀寫,即讀寫文件只能從頭開(kāi)始,依次讀寫各個(gè)數(shù)據(jù)。但在實(shí)際開(kāi)發(fā)中經(jīng)常需要讀寫文件的指定部分,這就需要先移動(dòng)文件內(nèi)部的位置指針到指定位置,再進(jìn)行讀寫操作。這種將位置指針移動(dòng)至文件的指定位置開(kāi)始讀寫的方式稱為隨機(jī)讀寫。實(shí)現(xiàn)隨機(jī)讀寫需要移動(dòng)位置指針到指定位置,該操作通過(guò)rewind和fseek兩個(gè)函數(shù)實(shí)現(xiàn)。rewind函數(shù)用于將位置指針移動(dòng)到文件開(kāi)頭,fseek函數(shù)用于將位置指針移動(dòng)到文件任意位置。rewind與fseek函數(shù)函數(shù)的原型分別為:voidrewind(FILE*fp);intfseek(FILE*fp,longoffset,intorigin);其中,fp為文件指針,指向當(dāng)前被操作的文件;offset為偏移量,指以“起始點(diǎn)”為基點(diǎn),向前/后移動(dòng)的字節(jié)數(shù)(長(zhǎng)整型);origin為起始位置,即從何處開(kāi)始計(jì)算偏移量。起始位置有文件開(kāi)頭、當(dāng)前位置和文件末尾三種,分別用對(duì)應(yīng)的常量0、
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 燃料倉(cāng)儲(chǔ)安全企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力項(xiàng)目商業(yè)計(jì)劃書
- 高纖維谷物奶行業(yè)深度調(diào)研及發(fā)展項(xiàng)目商業(yè)計(jì)劃書
- 傳統(tǒng)小吃文化體驗(yàn)館行業(yè)深度調(diào)研及發(fā)展項(xiàng)目商業(yè)計(jì)劃書
- 家庭田地分協(xié)議書
- 高精度聲速測(cè)量?jī)x企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力項(xiàng)目商業(yè)計(jì)劃書
- 萬(wàn)能險(xiǎn)AI應(yīng)用行業(yè)深度調(diào)研及發(fā)展項(xiàng)目商業(yè)計(jì)劃書
- 鐵路信號(hào)中的通信技術(shù)鐵路通信概述92課件
- 《旅游英語(yǔ)》電子教案-Unit 5
- 語(yǔ)文新課標(biāo)視域下傳統(tǒng)文化的教學(xué)現(xiàn)狀與策略
- 夏季高溫施工人員防護(hù)措施
- (完整版)WlTC循環(huán)工況測(cè)試數(shù)據(jù)
- 不同物種的細(xì)胞色素c分子異同比較分析
- 游泳館衛(wèi)生許可證申請(qǐng)書
- 工序報(bào)驗(yàn)申請(qǐng)表
- 物質(zhì)安全數(shù)據(jù)表(MSDS)84消毒液
- 物業(yè)監(jiān)控室視頻圖像點(diǎn)信息采集表
- 三相異步電動(dòng)機(jī)的正反轉(zhuǎn)
- hec教程用戶手冊(cè)中文版
- 救護(hù)車急診出診轉(zhuǎn)運(yùn)風(fēng)險(xiǎn)相關(guān)事項(xiàng)告知書
- 六輥軋機(jī)軋輥裝置的設(shè)計(jì)
- 初中學(xué)生綜合素質(zhì)表現(xiàn)評(píng)價(jià)檔案
評(píng)論
0/150
提交評(píng)論