第10章-標(biāo)準(zhǔn)輸入輸出庫(kù)_第1頁(yè)
第10章-標(biāo)準(zhǔn)輸入輸出庫(kù)_第2頁(yè)
第10章-標(biāo)準(zhǔn)輸入輸出庫(kù)_第3頁(yè)
第10章-標(biāo)準(zhǔn)輸入輸出庫(kù)_第4頁(yè)
第10章-標(biāo)準(zhǔn)輸入輸出庫(kù)_第5頁(yè)
已閱讀5頁(yè),還剩38頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第十章標(biāo)準(zhǔn)輸入輸出庫(kù)1關(guān)于標(biāo)準(zhǔn)I/O庫(kù)2主要內(nèi)容標(biāo)準(zhǔn)I/O的基本概念流緩存標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出及標(biāo)準(zhǔn)錯(cuò)誤輸出使用標(biāo)準(zhǔn)I/O進(jìn)行文件操作流文件的開(kāi)關(guān)方式單字符方式讀寫(xiě)行方式讀寫(xiě)二進(jìn)制方式讀寫(xiě)格式化輸入/輸出3引入Linux系統(tǒng)下的文件操作有兩種方式:直接調(diào)用文件操作的系統(tǒng)調(diào)用(API方式)標(biāo)準(zhǔn)輸入輸出方式(標(biāo)準(zhǔn)I/O)標(biāo)準(zhǔn)I/O庫(kù)是于1975年左右編寫(xiě)完成的,是用于處理流和文件的一個(gè)庫(kù).

標(biāo)準(zhǔn)I/O庫(kù)可以在很多操作系統(tǒng)下移植?;綢/O是針對(duì)文件描述符的,而標(biāo)準(zhǔn)I/O是基于流的。當(dāng)通過(guò)標(biāo)準(zhǔn)I/O打開(kāi)或者創(chuàng)建文件的時(shí)候,系統(tǒng)使用一個(gè)流和文件相關(guān)聯(lián)。在Unix&Linux環(huán)境中,標(biāo)準(zhǔn)I/O庫(kù)是建立在基本I/O基礎(chǔ)之上的。4流使用標(biāo)準(zhǔn)I/O庫(kù)訪問(wèn)文件時(shí),需要首先打開(kāi)文件。打開(kāi)文件成功后,系統(tǒng)內(nèi)核將返回流(stream)數(shù)據(jù)結(jié)構(gòu)。所有對(duì)該文件的后續(xù)操作都將針對(duì)這個(gè)數(shù)據(jù)結(jié)構(gòu)進(jìn)行。實(shí)際上流結(jié)構(gòu)是一個(gè)指向FILE結(jié)構(gòu)的指針。FILE結(jié)構(gòu)流文件描述符緩存指針緩存區(qū)Inode結(jié)構(gòu)…………5緩存標(biāo)準(zhǔn)輸入輸出方式(標(biāo)準(zhǔn)I/O)與直接調(diào)用文件操作的系統(tǒng)調(diào)用(API方式)的區(qū)別:標(biāo)準(zhǔn)I/O帶緩存文件操作無(wú)緩存緩存的含義:在對(duì)文件進(jìn)行I/O操作時(shí),對(duì)數(shù)據(jù)的讀寫(xiě)并不直接對(duì)文件系統(tǒng),而是對(duì)緩存進(jìn)行。當(dāng)緩存空間滿(mǎn)時(shí),由系統(tǒng)根據(jù)緩存內(nèi)容刷新到文件系統(tǒng)。優(yōu)點(diǎn):降低調(diào)用文件操作的頻率。6緩存標(biāo)準(zhǔn)I/O庫(kù)提供的緩存方式有3種:全緩存(緩存填滿(mǎn),則向文件系統(tǒng)刷新)行緩存(遇換行符,則向文件系統(tǒng)刷新)不緩存緩存在第一次調(diào)用I/O庫(kù)時(shí),由系統(tǒng)自動(dòng)調(diào)用malloc分配。7緩存舉例例:分別向標(biāo)準(zhǔn)輸出(stdout)和標(biāo)準(zhǔn)錯(cuò)誤(stderr)輸出信息,比較行緩存和不緩存的區(qū)別。8緩存舉例分析:標(biāo)準(zhǔn)輸出采用行緩存,由于未輸出換行符,所以本條消息不會(huì)立即顯示;標(biāo)準(zhǔn)錯(cuò)誤輸出是不緩存的,所以立刻輸出。標(biāo)準(zhǔn)I/O庫(kù)提供改變緩存方式的函數(shù):Setbuf()Setbuffer()Setlinebuf()以上函數(shù)的聲明位于頭文件<stdio.h>中9改變流的緩存方式#include<stdio.h>voidsetbuf(FILE*stream,char*buf)voidsetbuffer(FILE*stream,char*buf,size_tsize)voidsetlinebuf(FILE*stream)setbuf函數(shù):設(shè)置某個(gè)流對(duì)象的緩存區(qū)為BUFSIZ。buf若為NULL,則表示設(shè)置流為無(wú)緩沖模式。setlinebuf函數(shù):設(shè)置某個(gè)流對(duì)象為行緩存模式。setbuffer函數(shù):設(shè)置某個(gè)流對(duì)象的緩存區(qū)為指定值。參數(shù)說(shuō)明:stream:流對(duì)象buf:自定義緩存區(qū)指針size:緩存區(qū)大小BUFSIZ是一個(gè)全局的常量10緩存舉例例:分別向標(biāo)準(zhǔn)輸出(stdout)和標(biāo)準(zhǔn)錯(cuò)誤(stderr)輸出信息,比較行緩存和不緩存的區(qū)別。11緩存舉例結(jié)果分析:調(diào)用setbuf關(guān)閉緩存,使標(biāo)準(zhǔn)輸出成為無(wú)緩存模式。12標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出對(duì)每一個(gè)進(jìn)程來(lái)說(shuō),系統(tǒng)默認(rèn)為其打開(kāi)3個(gè)流:標(biāo)準(zhǔn)輸入標(biāo)準(zhǔn)輸出標(biāo)準(zhǔn)錯(cuò)誤輸出分別用宏定義表示(stdin,stdout,stderr)stdinstdoutstderr012UNIX/Linux下的文件描述符

13輸入輸出重定向舉例例:編程實(shí)現(xiàn)標(biāo)準(zhǔn)輸出的重定向。文件描述符1代表標(biāo)準(zhǔn)輸出/*流文件描述符*/14上例說(shuō)明:voidperror(constchar*s);

函數(shù)說(shuō)明:perror()用來(lái)將上一個(gè)函數(shù)發(fā)生錯(cuò)誤的原因輸出到標(biāo)準(zhǔn)設(shè)備(stderr)。參數(shù)s所指的字符串會(huì)先打印出,后面再加上錯(cuò)誤原因字符串。此錯(cuò)誤原因依照全局變量errno的值來(lái)決定要輸出的字符串。函數(shù)名:dup2功能:復(fù)制文件句柄用法:intdup2(intoldhandle,intnewhandle);15主要內(nèi)容標(biāo)準(zhǔn)I/O的基本概念流緩存標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出及標(biāo)準(zhǔn)錯(cuò)誤輸出使用標(biāo)準(zhǔn)I/O進(jìn)行文件操作流文件的開(kāi)關(guān)方式單字符方式讀寫(xiě)行方式讀寫(xiě)二進(jìn)制方式讀寫(xiě)格式化輸入/輸出16使用標(biāo)準(zhǔn)I/O進(jìn)行文件操作要對(duì)一個(gè)流進(jìn)行操作,必先打開(kāi)該流,然后調(diào)用標(biāo)準(zhǔn)I/O函數(shù)進(jìn)行讀寫(xiě)。17打開(kāi)關(guān)閉流文件fopen函數(shù)(用前需打開(kāi))類(lèi)似與底層的open系統(tǒng)調(diào)用。主要用于文件的輸入輸出參數(shù)說(shuō)明:filename指定打開(kāi)的文件mode打開(kāi)文件的方式18打開(kāi)關(guān)閉流文件mode參數(shù):“r”:以只讀方式打開(kāi),該文件必須存在?!皉+”:以可讀寫(xiě)方式打開(kāi),該文件必須存在?!皉b+”:讀寫(xiě)打開(kāi)一個(gè)二進(jìn)制文件?!皐”:以只寫(xiě)方式打開(kāi),文件長(zhǎng)度截短為零,不存在可建立。“w+”:以讀寫(xiě)方式打開(kāi),文件清零,不存在可建立?!皐b”:只寫(xiě)打開(kāi)或建立一個(gè)二進(jìn)制文件?!皐b+”:讀寫(xiě)打開(kāi)或建立一個(gè)二進(jìn)制文件?!癮”:以追加只寫(xiě)方式打開(kāi)文件,不存在可建立?!癮+”:以追加可讀寫(xiě)方式打開(kāi)文件,不存在可建立。19打開(kāi)關(guān)閉流文件fclose函數(shù)(用后需關(guān)閉)關(guān)閉指定的文件流stream,使所有尚未寫(xiě)出的數(shù)據(jù)都寫(xiě)出。20打開(kāi)關(guān)閉流文件fopen與fclose例程#include<stdio.h>intmain(){ FILE*fp; fp=fopen("file","w"); fclose(fp); return0;}21單字符方式讀寫(xiě)標(biāo)準(zhǔn)I/O庫(kù)提供多種讀寫(xiě)方式:?jiǎn)巫址绞阶x寫(xiě)行方式讀寫(xiě)二進(jìn)制方式讀寫(xiě)單字符讀寫(xiě)函數(shù)有以下6種:fgetc(getc),getchar從流中讀取字符fputc(putc),putchar向流中寫(xiě)入字符22單字符方式讀寫(xiě)fgetc、getc和getchar函數(shù)從文件流里讀取下一個(gè)字節(jié)并把它作為一個(gè)字符返回。當(dāng)達(dá)到文件尾時(shí),返回EOF。字符被強(qiáng)制轉(zhuǎn)換為int型getchar()相當(dāng)于getc(stdin)23單字符方式讀寫(xiě)fputc、putc和putchar函數(shù)把一個(gè)字符寫(xiě)到一個(gè)輸出文件流中。返回寫(xiě)入的值,如果失敗,返回EOF。24單字符方式讀寫(xiě)舉例例:編程實(shí)現(xiàn)十六進(jìn)制格式顯示文件內(nèi)容。(exam4.c)25單字符方式讀寫(xiě)舉例/*對(duì)C取16進(jìn)制值保存到緩存區(qū)*/26行方式讀寫(xiě)對(duì)于大部分情況下,文本文件與無(wú)格式文件進(jìn)行的讀寫(xiě)過(guò)程都是按行進(jìn)行。標(biāo)準(zhǔn)I/O庫(kù)提供的按行讀寫(xiě)函數(shù):#include<stdio.h>char*fgets(char*s,intn,FILE*stream)intfputs(char*s,FILE*stream)參數(shù)說(shuō)明:s:讀取或?qū)懭氲木彺鎱^(qū)n:從流中讀取的長(zhǎng)度,單位字節(jié)stream:流指針27行方式讀寫(xiě)舉例例:編程實(shí)現(xiàn)按行讀取文件的內(nèi)容并輸出至屏幕。(exam5)優(yōu)點(diǎn):不必?fù)?dān)心文件過(guò)長(zhǎng);不會(huì)占用過(guò)多緩存區(qū)28二進(jìn)制方式讀寫(xiě)按行方式適應(yīng)大部分文本格式文件,但有些情況,文件的內(nèi)容卻需要按一定格式存放,比如存儲(chǔ)了某個(gè)結(jié)構(gòu)體。此時(shí)如果按行讀寫(xiě)的話,讀取到的數(shù)據(jù)將無(wú)法恢復(fù)到原來(lái)的格式。在這種情況下,需使用標(biāo)準(zhǔn)I/O庫(kù)提供的二進(jìn)制方式讀寫(xiě)功能。29二進(jìn)制方式讀寫(xiě)二進(jìn)制方式最常用的場(chǎng)合即是結(jié)構(gòu)體讀寫(xiě)。#include<stdio.h>size_tfread(void

*buffer,

size_t

size,

size_t

count,

FILE

*stream)size_tfwrite(constvoid*buffer,size_tsize,size_tcount,FILE*stream)參數(shù)說(shuō)明:buffer讀取或?qū)懭氲膬?nèi)容size每條記錄長(zhǎng)度count記錄個(gè)數(shù)stream指向流的指針30二進(jìn)制方式讀寫(xiě)fread函數(shù)從一個(gè)文件流里讀取數(shù)據(jù)。數(shù)據(jù)從文件流stream讀到ptr指定的數(shù)據(jù)緩沖區(qū)里,函數(shù)返回值是成功讀到數(shù)據(jù)緩沖區(qū)里的記錄個(gè)數(shù)(不是字節(jié)數(shù))size參數(shù)指定每個(gè)數(shù)據(jù)記錄的長(zhǎng)度nitems給出要傳輸?shù)挠涗泜€(gè)數(shù)31二進(jìn)制方式讀寫(xiě)fwrite函數(shù)從指定的緩沖區(qū)里讀取數(shù)據(jù)記錄,并把他們寫(xiě)到輸出流中,返回值為成功寫(xiě)入的記錄個(gè)數(shù)。32二進(jìn)制方式讀寫(xiě)舉例例:實(shí)現(xiàn)對(duì)結(jié)構(gòu)體進(jìn)行讀寫(xiě)。姓名年齡身高創(chuàng)建.bin二進(jìn)制文件33二進(jìn)制方式讀寫(xiě)舉例向流中寫(xiě)入打開(kāi).bin文件讀取一條記錄輸出數(shù)據(jù)34格式化輸入輸出格式化輸入輸出函數(shù):printf();sprintf();fprintf()scanf();sscanf();fscanf();35格式化輸入輸出printf、fprintf和sprintf函數(shù)能夠?qū)Ω鞣N不同類(lèi)型的參數(shù)進(jìn)行格式編排和輸出。每個(gè)參數(shù)在輸出流中的表示形式是由格式參數(shù)format控制的S緩存區(qū)FILE流3

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論