第九章輸入輸出與底層接口_第1頁(yè)
第九章輸入輸出與底層接口_第2頁(yè)
第九章輸入輸出與底層接口_第3頁(yè)
第九章輸入輸出與底層接口_第4頁(yè)
第九章輸入輸出與底層接口_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第九章 輸入輸出與低層接口輸入輸出、串處理、存儲(chǔ)管理等在中都是通過(guò)調(diào)用標(biāo)準(zhǔn)庫(kù)函數(shù)和宏定義實(shí)現(xiàn)的,另外程序還可以與操作系統(tǒng)的接口(低層接口)實(shí)現(xiàn)輸入輸出和存儲(chǔ)管理。文件是在內(nèi)存以外的媒體(或設(shè)備)上的某種形式組織的數(shù)據(jù)集合,可以按文件名來(lái)存取。任何計(jì)算機(jī)系統(tǒng)都包括文件系統(tǒng),對(duì)應(yīng)文件的組織和存取進(jìn)行管理,對(duì)于來(lái)說(shuō),一切能進(jìn)行輸入輸出設(shè)備,包括終端打印機(jī),磁盤等均稱之為文件(外部文件),輸入輸出函數(shù)和低層接口實(shí)現(xiàn)了內(nèi)存中的程序與文件間的數(shù)據(jù)交換。標(biāo)準(zhǔn)輸入輸出函數(shù)是通過(guò)操作FILE類型(中定義的結(jié)構(gòu)類型)的指針(稱之為文件指針)實(shí)現(xiàn)對(duì)文件的存取,用這種方式存取的文件稱流式文件,來(lái)源于流式文件或輸出到流

2、式文件的字節(jié)序列稱為流。流式文件通常是有緩沖區(qū)的。低層接口是通過(guò)操作文件描述符(int整數(shù))實(shí)現(xiàn)對(duì)文件的存取,用這種方式存取的文件稱為非流式文件,非流式文件的存取無(wú)緩沖區(qū),無(wú)格式的。文件處理的一般步驟為:()首先打開(kāi)文件,建立文件指針或文件描述符與外部文件的聯(lián)系。()通過(guò)文件指針或文件描述符進(jìn)行讀寫操作,()關(guān)閉文件,切斷文件指針或文件描述符與外部文件的聯(lián)系。在程序初啟時(shí),有三個(gè)標(biāo)準(zhǔn)流式文件被自動(dòng)打開(kāi):標(biāo)準(zhǔn)輸入文件(文件指針為stdin),標(biāo)準(zhǔn)輸出文件(文件指針為stdout),標(biāo)準(zhǔn)錯(cuò)誤文件(文件指針為stderr),它們都對(duì)應(yīng)于終端設(shè)備。 流式文件輸入輸出標(biāo)準(zhǔn)輸入輸出支持兩種形式的流式文件:

3、文本文件和二進(jìn)制文件。文本文件是分行的字符序列,每行為個(gè)或多個(gè)字符再加上行結(jié)束符(n)組成。由于不同環(huán)境下,文本的表示不一定相同,所以文本流的字符與外部表示的字符之間不一定存在一一對(duì)應(yīng)關(guān)系(例如行結(jié)束符,在有的系統(tǒng)是外部表示為n,r n(兩個(gè)字符)二進(jìn)制文件是一個(gè)內(nèi)部表示的數(shù)據(jù)序列,每個(gè)數(shù)據(jù)都具有相同的存儲(chǔ)結(jié)構(gòu)。頭文件“說(shuō)明了流式文件處理函數(shù)的原型。 文件的打開(kāi)與關(guān)閉函數(shù)fopen和freopen用來(lái)打開(kāi)文件,fclose用來(lái)關(guān)閉文件。()FILE *fopen(const char *filename, const char *mode)fopen打開(kāi)名為filename(或文件的路徑)的文

4、件,它返回一個(gè)指向打開(kāi)文件的指針,如果打開(kāi)失敗,則返回NULL,參數(shù)mode指明打開(kāi)文件的方式,它可以是下列值之一:“r” 打開(kāi)用于讀的文本文件(文件必須已經(jīng)存在)“w” 創(chuàng)建(并打開(kāi))用于寫的文本文件,如果該文件已存在,則被替換為空文件?!癮” 在文件的尾進(jìn)行添加,打開(kāi)或創(chuàng)建用于寫的文本文件?!皉b” 打開(kāi)用于讀的二進(jìn)制文件?!皐b” 創(chuàng)建(并打開(kāi))用于寫的二進(jìn)制文件?!癮b” 在二進(jìn)制文件的尾部進(jìn)行添加?!皉+” 打開(kāi)用于更新的文本文件(文件必須已經(jīng)存在)?!皐+” 創(chuàng)建用于更新的文本文件,如果該文件存在則被替換為空文件?!癮+” 在文件尾部進(jìn)行添加,打開(kāi)并創(chuàng)建用于更新的文本文件?!皉b+

5、” 對(duì)二進(jìn)制文件進(jìn)行上述操作?!皐b+” “ab+” 加上一個(gè)“其區(qū)別在于由單一的只讀或只寫方式擴(kuò)展為又能寫的方式。但從讀轉(zhuǎn)為寫(或?qū)戅D(zhuǎn)為讀)時(shí),其間必須調(diào)用fflush或定位函數(shù)。文件名最多允許FILENAME_MAX個(gè)字符,至多有FOPEN_MAX個(gè)文件同時(shí)被打開(kāi),上述兩上符號(hào)常量是在中定義的常量,所有作為輸入、輸出函數(shù)參數(shù)的符號(hào)常量,都在中定義。以上是ANSI C的規(guī)定,可以看到它能夠處理文本文件或二進(jìn)制文件,但有些目前使用的語(yǔ)言緩沖文件系統(tǒng)不具備上述所有功能,如只能用”r”,”w”,”a”方式處理文本文件,而不能用”rb”,”wb”,”ab”方式處理二進(jìn)制,有如編譯器,不用”r+”.”

6、w+”,”a+”而用”rw”,”wr”,”ab”等,需要查閱相關(guān)資料或上機(jī)調(diào)試。例如:if (fp=fopen(“xx.dat”,”r”)=NULL) printf(“Cannot open %sn”,”xx.dat”); exit(-1);以只讀方式打開(kāi)一個(gè)名為的正文文件,如果打開(kāi)失敗,打印”Cannot open xx.dat”并調(diào)用exit函數(shù)終止運(yùn)行。() FILE *freopen(const char *filename, const char *mode, FILE *stream)關(guān)閉stream當(dāng)前所代表的文件,按mode指定方式重新建立stream與filename文件的聯(lián)

7、系,函數(shù)的返回值為參數(shù)stream,如果出錯(cuò),則返回值NULL,此時(shí)老文件被關(guān)閉,freopen主要用于改變stdin,stdout和stderr所聯(lián)系的文件(使標(biāo)準(zhǔn)設(shè)備轉(zhuǎn)向外存儲(chǔ)設(shè)備)。()int fclose(FILE *stream)關(guān)閉stream指示的文件,該文件在此之前是由fopen或freopen打開(kāi)的,關(guān)閉文件時(shí),緩沖區(qū)所有未寫出的數(shù)據(jù)被清倉(cāng)并回收系統(tǒng)分配的輸入輸出緩沖區(qū),如果出錯(cuò),返回EOF,否則返回。另外,程序終結(jié)時(shí),會(huì)自動(dòng)調(diào)用fclose關(guān)閉所有打開(kāi)的文件。例 拷貝文本文件,命令格式如下: copy source target #include “stdio.h”void

8、 main(int argc, char *argv) int ch; if (argc!=3) printf(“arguments errorn”) exit(-1); if (freopen(argv1,”r”,stdin)=NULL) printf("Can't open %sn",argv1);exit(-1);freopen(argv2,"w", stdout) while(char=getchar(i)<>EOF) putchar(char); fclose(stdin); fcolse(stdout);本例采用freop

9、n改變stdin, stdout 所連接的文件,使 getchar和putchar函數(shù)轉(zhuǎn)向磁盤文件。 除了前面介紹的getchar,putchar,printf,scant 四個(gè)基本的標(biāo)準(zhǔn)文件讀/寫函數(shù)外,還有如下函數(shù)用于輸入輸出: 1. 字符讀/寫函數(shù):int fgetc(FILE *stream)從流式文件stream中讀取一個(gè)字符并將該字符轉(zhuǎn)換為int返回,到文件尾時(shí) 返回EOF。int fputc(int c,FILE &stream)將c轉(zhuǎn)換為unsigned char 并寫入到流式文件stream中去,它返回寫入的字符,出錯(cuò)時(shí)返回EOF. int getc(FILE *st

10、ream)int putc(int c, FILE * stream)getc和putc的功能分別等同于fgetc和fputc,只不過(guò)它們是宏定義,而不是函數(shù)。int ungetc(int c,FILE * stream) 將c轉(zhuǎn)化為unsigned char ,并且送到流式文件stream,c將在下一次被讀入,對(duì)于一個(gè)流式文件,只保證回送一個(gè)字符且EOF不能被回送,該函數(shù)返回回送的字符,或者在出錯(cuò)時(shí)返回EOF。例2 用gefc,putc重寫例# include <stdio.h>void main(int argc,char *argv)FILE *fin,*fout;if (a

11、rgc!=3)printf("Argument errorn");exit(-1);if (fin=fopen(argv1,"r")=NULL)printf("Can't open %sn",argv1);exit(-1);if (fout=fopen(argv2,"w")=NULLprintf("Cant't open %sn",argv2);exit(-1);while(! feof(fin)putc(getc(fm),fout);fclose(fin);fclose(fou

12、t);函數(shù)feof用來(lái)測(cè)試文件尾。例3,例4,p299,p3002. 格式輸入/輸出函數(shù)int fprintf(FILE *stream, const cha*format,.)int sprintf(char*s,const char*format,.)int fscanf(FILE*stream, const char*format,.)int sscanf(char *s, const char*format,.)fprintf和sprintf類似于printf, 只不過(guò)fpintf的輸出結(jié)果是寫到文件stream中去,sprintf的結(jié)果寫到字符串s中去,而printf只寫到stdou

13、t。fscanf和sscanf類似于scanf,而fscanf的輸入流來(lái)源于文件stream,sscanf來(lái)源于字符串s,scanf的輸入流來(lái)源于stdin。例5,例6,p307, p308 字符串輸入輸出函數(shù)char *fgets(char *s, int n, FILE *stream)char *gets(char *s)int fputs(const char *s, FILE *stream)int puts(const char *s)fgets從流式文件stream讀入n-1個(gè)字符到數(shù)組s中去,如果讀入的字符不是n-1個(gè)就遇到行結(jié)束符,則停止讀入,被讀到的字符(包括行結(jié)束符)均存

14、入到數(shù)組s中,且在串尾補(bǔ)上0作為結(jié)尾。fgets返回s,遇到文件尾或出錯(cuò)返回NULL。gets從stdin中讀一行至數(shù)組s中,它將結(jié)尾的行結(jié)束符改為0。該函數(shù)返回s,遇到文件尾或出錯(cuò)返回NULL。fputs將字符串s輸出到流式文件stream中,串的未尾不添加換行n,它返回非負(fù)值,出錯(cuò)時(shí)返回EOF。Puts將字符串和一個(gè)n字符寫到stdout中,出錯(cuò)時(shí)返回EOF,否則返回一個(gè)非負(fù)數(shù)。例 P304 例10 P305成組輸入輸出函數(shù)應(yīng)用中需要把成組的數(shù)據(jù)寫到文件中去或從文件讀到內(nèi)存中來(lái),標(biāo)準(zhǔn)函數(shù)fread和fwrite提供了這種功能,它們通常用于讀寫二進(jìn)制文件,被讀寫的數(shù)據(jù)可以是一個(gè)結(jié)構(gòu)或數(shù)組,也

15、可以是一個(gè)簡(jiǎn)單數(shù)據(jù),總之,要求文件中每一組數(shù)據(jù)的存儲(chǔ)長(zhǎng)度相同。fread和fwrite的原型如下:Size-t fread(void *ptr, size-t size, size_t nobj, FILE *stream)Size-t fwrite(const void *ptr, size-t size, size_t nobj, FILE *stream)fread從流式文件stream中讀取至多nobj個(gè)大小為size的對(duì)象到ptr所指示的數(shù)組中,它返回讀到的對(duì)象的數(shù)目,返回值可以小于nobj所要求的對(duì)象數(shù),如需要確定是否到文件尾或出錯(cuò),可以使用函數(shù)feof和ferror.fwrite

16、將ptr所指示的數(shù)組nobj個(gè)大小為size的對(duì)象寫到流式文件中去,返回寫出的對(duì)象的數(shù)目,出錯(cuò)時(shí)返回值小于nobj。例P309 P311 文件的隨機(jī)存取上節(jié)介紹的讀寫函數(shù)是順序地讀取或?qū)懭胛募?,即每次讀寫均以上次讀或?qū)懞蟮奈恢米鳛槠瘘c(diǎn),然而有時(shí)程序需要從文件的任意位置開(kāi)始讀寫,利用標(biāo)準(zhǔn)庫(kù)中提供了定位函數(shù)可實(shí)現(xiàn)流式文件的隨機(jī)讀寫,它們的原型為:int fseek(FILE *stream, long offset, int origin)long ftell(FILE *stream)void rewind(FILE *stream)int fgetpos(FILE *stream, fops_

17、t *ptr)int fsetpos(FILE *stream, const fops_t *ptr)fseek設(shè)置在流式文件中的讀寫位置,隨后的讀寫以該位置開(kāi)始,參數(shù)origin是距離起始位置標(biāo)志。Offset是距起始位置的偏移量。對(duì)二進(jìn)制文件,origin可以是SEEK_SET,SEEK_CUR或SEEK_END(“stdio.h”中定義的常數(shù)分別是0,1,2)。如fseek(fp,10L,0); 將位置指針移到離文件開(kāi)始處個(gè)字節(jié)處。 fseek(fp,-20L,1); 將位置指針從當(dāng)前位置向后移個(gè)字節(jié)處。 fseek(fp,-50L,2); 將位置指針從文件末尾前移個(gè)字節(jié)處。Fseek在

18、正常情況下返回,出錯(cuò)時(shí)返回非。Ftell返回文件stream的當(dāng)前讀寫位置,出錯(cuò)時(shí)返回-1L。Rewind重新將與stream相聯(lián)系的文件定位在開(kāi)始位置上,并清除文件結(jié)束標(biāo)志和錯(cuò)誤標(biāo)志。Fgetpos將stream的當(dāng)前位置記錄到*ptr中,供以后的fgsetpos使用。該函數(shù)正常返回,出錯(cuò)時(shí)返回非。Ptr是fpos_t類型的指針,fpos_t是適合于記錄位置值的類型,由實(shí)現(xiàn)定義。Fsetpos將文件指針stream設(shè)置到fgetpos中*ptr所記錄的位置上,正常返回,出錯(cuò)返回非。 其它有關(guān)函數(shù)在頭文件”stdio.h”中還說(shuō)明了一些與流式文件相關(guān)的函數(shù)。int fflush (FILE *

19、stream)如果被打開(kāi)的stream用作輸出,函數(shù)fflush使stream緩沖區(qū)的內(nèi)容被寫到相應(yīng)的文件中去(清倉(cāng))。如果被打開(kāi)的stream用作輸入,則fflush將清除緩沖區(qū)的內(nèi)容。Stream還可以為空。Fflush()對(duì)所有的輸出緩沖區(qū)清倉(cāng)。Fflush正常返回,出錯(cuò)時(shí)返回EOF。Int remove(const char *filename)刪除filename所指定的文件,如果指定的文件是被打開(kāi)的,則不能刪除它。文件被刪除時(shí)返回,否則返回非。Int rename(const char *oldname, const char *newname)將名為oldname的文件換名為ne

20、wname,如果換名成功返回,否則返回非。FILE *tmpfile(void)以”wb+”方式創(chuàng)建并打開(kāi)一個(gè)臨時(shí)文件,關(guān)閉該文件或在程序運(yùn)行結(jié)束時(shí)所創(chuàng)建的文件被自動(dòng)刪除,創(chuàng)建成功返回文件指針,否則返回NULL。Char *tmpnam(char sL_tmpnam)創(chuàng)建一個(gè)新的文件名,數(shù)組s存放文件名。Int setvbuf(FILE *stream, char *buf, int mode, size_t size)允許用戶控制指定的stream緩沖區(qū)。Void setbuf(FILE * stream, char *buf)同上void clearerr(FILE *stream)清除s

21、tream文件尾標(biāo)志和錯(cuò)誤標(biāo)志。Int feof(FILE *stream)如果stream的文件尾標(biāo)志被置位,則返回。Int ferror(FILE *stream)如果stream的錯(cuò)誤標(biāo)志被置位,則返回非。Void perror(const char *s)打印參數(shù)s與錯(cuò)誤號(hào)errno相對(duì)應(yīng)的信息,在頭文件”errno.h”中定義。 輸入輸出的低層接口計(jì)算機(jī)系統(tǒng)中各種資源均由統(tǒng)一管理,若要使用這些資源,必須向發(fā)出請(qǐng)求,然后由響應(yīng)這些請(qǐng)求,為此,必須提供一些接口,使外層軟件和用戶程序能通過(guò)這些接口方便地使用提供的各種功能,稱為系統(tǒng)調(diào)用。 文件的創(chuàng)建、打開(kāi)、關(guān)閉和刪除文件的創(chuàng)建當(dāng)程序員希望創(chuàng)建一個(gè)新文件或重寫一個(gè)老文件時(shí),可使用低層接口creat,其原型如下:int creat(char *name, int perms)其中參數(shù)name是用戶要建立的新文件名(包括路徑名在內(nèi)),perms是用戶指定的新文件存取權(quán)限,不同的對(duì)它的解釋不同。在TC中, 表示只讀 表示只

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論