




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
fopen()打開流FILE*fopen(constchar*filename,constchar*mode)字符串含義"r"以只讀方式打開文件"w"以只寫方式打開文件"a"以追加方式打開文件"r+"以讀/寫方式打開文件,如無文件出錯(cuò)"w+"以讀/寫方式打開文件,如無文件生成新文件fclose()關(guān)閉流 intfclose(FILE*fp)如果成功,返回0,失敗返回EOF。fputc()寫一個(gè)字符到流中 intfputc(intc,FILE*stream)成功返回這個(gè)字符,失敗返回EOF。fgetc()從流中讀一個(gè)字符 intfputc(FILE*stream)成功返回這個(gè)字符,失敗返回EOF。fseek()在流中定位到指定的字符 intfseek(FILE*stream,longoffset,intwhence)如果成功返回0,參數(shù)offset是移動(dòng)的字符數(shù),whence是移動(dòng)的基準(zhǔn),取值是符號(hào)常量值基準(zhǔn)位置SEEK_SET0文件開頭SEEK_CUR1當(dāng)前讀寫的位置SEEK_END2文件尾部fputs()寫字符串到流 intfputs(constchar*s,FILE*stream)fgets()從流中讀一行或指定個(gè)字符 char*fgets(char*s,intn,FILE*stream)從流中讀取n-1個(gè)字符,除非讀完一行,參數(shù)s是來接收字符串,如果成功則返回s的指針,否則返回NULL。fprintf()按格式輸出到流 intfprintf(FILE*stream,constchar*format[,argument,...])fscanf()從流中按格式讀取 intfscanf(FILE*stream,constchar*format[,address,...])feof()到達(dá)文件尾時(shí)返回真值 intfeof(FILE*stream)ferror()發(fā)生錯(cuò)誤時(shí)返回其值 intferror(FILE*stream)voidclearerr(FILE*stream) 返回流最近的錯(cuò)誤代碼,可用clearerr()來清除它rewind()復(fù)位文件定位器到文件開始處 voidrewind(FILE*stream)remove()刪除文件 intremove(constchar*filename)成功返回0。fread()從流中讀指定個(gè)數(shù)的字符 size_tfread(void*ptr,size_tsize,size_tn,FILE*stream)fwrite()向流中寫指定個(gè)數(shù)的字符 size_tfwrite(constvoid*ptr,size_tsize,size_tn,FILE*stream)tmpfile()生成一個(gè)臨時(shí)文件流FILE*tmpfile(void)以"w+b"的模式打開,并返回這個(gè)臨時(shí)流的指針,如果失敗返回NULL。tmpnam()生成一個(gè)唯一的文件名 char*tmpnam(char*s)參數(shù)s用來保存得到的文件名,并返回這個(gè)指針,如果失敗,返回NULL。longftell(FILE*p);ftell函數(shù)可以返回一個(gè)long型數(shù)值,該值是從文件開頭到當(dāng)前讀寫位置的全部的字節(jié)個(gè)數(shù),當(dāng)ftell返回的值等于文件的長度時(shí),表示讀寫位置位于文件的末尾。
>>
關(guān)于文件結(jié)束符EOF
EOF是EndOfFile的縮寫。
在C語言中,它是在標(biāo)準(zhǔn)庫中定義的一個(gè)宏。
人們經(jīng)常誤認(rèn)為EOF是從文件中讀取的一個(gè)字符。其實(shí),EOF不是一個(gè)字符,它被定義為是
int
類型的一個(gè)
說的標(biāo)準(zhǔn).正解.>>關(guān)于文件結(jié)束符EOF
EOF是EndOfFile的縮寫。
在C語言中,它是在標(biāo)準(zhǔn)庫中定義的一個(gè)宏。
人們經(jīng)常誤認(rèn)為
EOF是從文件中讀取的一個(gè)字符(牢記)。其實(shí),EOF不是一個(gè)字符,它被定義為是int類型的一個(gè)負(fù)數(shù)(比如-1)。EOF也不是文件中實(shí)際存在的內(nèi)容。EOF也不是只表示讀文件到了結(jié)尾這一狀態(tài)(這種狀態(tài)可以用feof()來檢測),它還能表示I/O操作中的讀、寫錯(cuò)誤(通常可以用ferror()來檢測)以及其它一些關(guān)聯(lián)操作的錯(cuò)誤狀態(tài)。getchar返回EOF如果讀到文件末大師級(jí)經(jīng)典的著作,要字斟句酌的去讀,去理解。以前在看K&R的TheCProgrammingLanguage(SecondEdition)
第1.5節(jié)的字符輸入/輸出,被getchar()和EOF所迷惑了??赡苤饕€是由于沒有搞清楚getchar()的工作原理和EOF的用法。因此,感覺很有必要總結(jié)一下,不然,很多瑣碎的知識(shí)點(diǎn)長時(shí)間過后就會(huì)淡忘的,只有寫下來才是最好的方法。
其實(shí),getchar()最典型的程序也就幾行代碼而已。
對(duì)于getchar,肯定很多初學(xué)的朋友會(huì)問,getchar不是以字符為單位讀取的嗎?那么,既然我輸入了第一個(gè)字符a,肯定滿足while循環(huán)(c=getchar())!=EOF的條件阿,那么應(yīng)該執(zhí)行putchar(c)在終端輸出一個(gè)字符a。不錯(cuò),我在用getchar的時(shí)候也是一直這么想的,但是程序就偏偏不著樣執(zhí)行,而是必需讀到一個(gè)換行符或者文件結(jié)束符EOF才進(jìn)行一次輸出。
2.getchar()的返回值一般情況下是字符,但也可能是負(fù)值,即返回EOF。
這里要強(qiáng)調(diào)的一點(diǎn)就是,getchar函數(shù)通常返回終端所輸入的字符,這些字符系統(tǒng)中對(duì)應(yīng)的ASCII值都是非負(fù)的。因此,很多時(shí)候,我們會(huì)寫這樣的兩行代碼:char
c;
c
=getchar();
這樣就很有可能出現(xiàn)問題。因?yàn)間etchar函數(shù)除了返回終端輸入的字符外,在遇到Ctrl+D(Linux下)即文件結(jié)束符EOF時(shí),getchar()的返回EOF,這個(gè)EOF在函數(shù)庫里一般定義為-1。因此,在這種情況下,getchar函數(shù)返回一個(gè)負(fù)值,把一個(gè)負(fù)值賦給一個(gè)char型的變量是不正確的。為了能夠讓所定義的變量能夠包含getchar函數(shù)返回的所有可能的值,正確的定義方法如下(K&RC中特別提到了這個(gè)問題):int
c;
c
=getchar();
二、EOF的兩點(diǎn)總結(jié)(主要指普通終端中的EOF)
1.EOF作為文件結(jié)束符時(shí)的情況:
EOF雖然是文件結(jié)束符,但并不是在任何情況下輸入Ctrl+D(Windows下Ctrl+Z)都能夠?qū)崿F(xiàn)文件結(jié)束的功能,只有在下列的條件下,才作為文件結(jié)束符。
(1)遇到getcahr函數(shù)執(zhí)行時(shí),要輸入第一個(gè)字符時(shí)就直接輸入Ctrl+D,就可以跳出getchar(),去執(zhí)行程序的其他部分;
(2)在前面輸入的字符為換行符時(shí),接著輸入Ctrl+D;
(3)在前面有字符輸入且不為換行符時(shí),要連著輸入兩次Ctrl+D,這時(shí)第二次輸入的Ctrl+D起到文件結(jié)束符的功能,至于第一次的Ctrl+D的作用將在下面介紹。
其實(shí),這三種情況都可以總結(jié)為只有在getchar()提示新的一次輸入時(shí),直接輸入Ctrl+D才相當(dāng)于文件結(jié)束符。
2.EOF作為行結(jié)束符時(shí)的情況,這時(shí)候輸入Ctrl+D并不能結(jié)束getchar(),而只能引發(fā)getchar()提示下一輪的輸入。
這種情況主要是在進(jìn)行g(shù)etchar()新的一行輸入時(shí),當(dāng)輸入了若干字符(不能包含換行符)之后,直接輸入Ctrl+D,此時(shí)的Ctrl+D并不是文件結(jié)束符,而只是相當(dāng)于換行符的功能,即結(jié)束當(dāng)前的輸入。以上面的代碼段為例,如果執(zhí)行時(shí)輸入abc,然后Ctrl+D,程序輸出結(jié)果為:
abcabc
注意:第一組abc為從終端輸入的,然后輸入Ctrl+D,就輸出第二組abc,同時(shí)光標(biāo)停在第二組字符的c后面,然后可以進(jìn)行新一次的輸入。這時(shí)如果再次輸入Ctrl+D,則起到了文件結(jié)束符的作用,結(jié)束getchar()。
如果輸入abc之后,然后回車,輸入換行符的話,則終端顯示為:
abc
//第一行,帶回車
abc
//第二行
//第三行
其中第一行為終端輸入,第二行為終端輸出,光標(biāo)停在了第三行處,等待新一次的終端輸入。
從這里也可以看出Ctrl+D和換行符分別作為行結(jié)束符時(shí),輸出的不同結(jié)果。
EOF的作用也可以總結(jié)為:當(dāng)終端有字符輸入時(shí),Ctrl+D產(chǎn)生的EOF相當(dāng)于結(jié)束本行的輸入,將引起getchar()新一輪的輸入;當(dāng)終端沒有字符輸入或者可以說當(dāng)getchar()讀取新的一次輸入時(shí),輸入Ctrl+D,此時(shí)產(chǎn)生的EOF相當(dāng)于文件結(jié)束符,程序?qū)⒔Y(jié)束getchar()的執(zhí)行。
【補(bǔ)充】本文第二部分中關(guān)于EOF的總結(jié)部分,適用于終端驅(qū)動(dòng)處于一次一行的模式下。也就是雖然getchar()和putchar()確實(shí)是按照每次一個(gè)字符
進(jìn)行的。但是終端驅(qū)動(dòng)處于一次一行的模式,它的輸入只有到“\n”或者EOF時(shí)才結(jié)束,因此,終端上得到的輸出也都是按行的。
(1)字節(jié)的讀取
在正常的情況下,getc以u(píng)nsignedchar的方式讀取文件流,擴(kuò)張為一個(gè)整數(shù),并返
回.換言之,getc從文件流中取一個(gè)字節(jié),并加上24個(gè)零,成為一個(gè)小于256的整數(shù),
然后返回.
intc;
while((c=fgetc(rfp))!=-1)//-1就是EOF
fputc(c,wfp);
上面fputc中的c雖然是整數(shù),但在fputc將其寫入文件流之前,又把整數(shù)的高24位
去掉了,因此fgetc,putc配合能夠?qū)崿F(xiàn)文件復(fù)制.到目前為止,把c定義為
char仍然是可行的,但下面我們將看到,把c定義為int是為正確判段文件是否結(jié)束.
(2)判斷文件結(jié)束.
多數(shù)人認(rèn)為文件中有一個(gè)EOF,用于表示文件的結(jié)尾.但這個(gè)觀點(diǎn)實(shí)際上是錯(cuò)誤的,在文
件所包含的數(shù)據(jù)中,并沒有什么文件結(jié)束符.對(duì)getc而言,如果不能從文件中讀取,
則返回一個(gè)整數(shù)-1,這就是所謂的EOF.返回EOF無非是出現(xiàn)了兩種情況,一是文件已
經(jīng)讀完;二是文件讀取出錯(cuò),反正是讀不下去了.
請(qǐng)注意:在正常讀取的情況下,返回的整數(shù)均小于256,即0x0~0xFF.而讀不出返回的
是0xFFFFFFFF.但,假如你用fputc把0xFFFFFFFF往文件里頭寫,高24位被屏蔽,寫入的將
是0xFF.//lixforalpha請(qǐng)注意這一點(diǎn)
(3)0xFF會(huì)使我們混淆嗎?
不會(huì),前提是,接收返回值的c要按原型定義為int.
如果下一個(gè)讀取的字符將為0xFF,則
intc;
c=fgetc(rfp);//c=0x000000FF;
if(c!=-1)//當(dāng)然不等,-1是0xFFFFFFFF
fputc(wfp);//噢,OXFF復(fù)制成功.
字符0xFF,其本身并不是EOF.
(4)將c定義char
假定下一個(gè)讀取的字符為0xFF則
charc;
c=fgetc(rfp);//fgetc(rfp)的值為0x000000FF,暗中降為字節(jié),c=0xFF
if(c!=-1)//字符與整數(shù)比較?c被帶符號(hào)(signed)擴(kuò)展為0xFFFFFFFF,喔噢,
條件成立,文件復(fù)制提前退出.
while((c=fgetc(rfp))!=EOF)中的判別條件成立,文件復(fù)制結(jié)束!意外中止.
(5)將c定義為unsignedchar;
當(dāng)讀到文件末尾,返回EOF也就是-1時(shí),
unsignedcharc;
c=fgetc(rfp);//fgetc(rfp)的值為EOF,即-1,即0xFFFFFFFF,降格為字節(jié),c=0xFF
if(c!=-1)
//c被擴(kuò)展為0x000000FF,永遠(yuǎn)不回等于0xFFFFFFFF
所以這次雖然能正確復(fù)制0xFF,但卻不能判斷文件結(jié)束.事實(shí)上,在c為uchar時(shí),
c!=-1是永遠(yuǎn)成立的,一個(gè)高質(zhì)量的編譯器,比如gcc會(huì)在編譯時(shí)指出這一點(diǎn).
(6)為何需要feof?
FILE*fp;
fp指向一個(gè)很復(fù)雜的數(shù)據(jù)結(jié)構(gòu),feof是通過這個(gè)結(jié)構(gòu)中的標(biāo)志來判斷文件是否結(jié)束的.
如果文件用fgetc讀取,剛好把最后一個(gè)字符讀出時(shí),fp中的EOF標(biāo)志不會(huì)打開,這時(shí)
用feof判斷,將會(huì)得到文件尚未結(jié)束的結(jié)論.
fgetc返回-1時(shí),我們?nèi)詿o法確信文件已經(jīng)結(jié)束,因?yàn)榭赡苁亲x取錯(cuò)誤!這時(shí)我們
需要feof和ferror.//EOF與feof()的確切含義2009-10-2317:42今天,遇到了在讀文件的時(shí)候,居然總是讀到文件中間某個(gè)字符時(shí),就退出了,我判斷是文件中的某個(gè)字符和文件的結(jié)束符相同導(dǎo)致的。
經(jīng)過檢查,確實(shí)發(fā)現(xiàn)有些在文本文件里不可見的字符導(dǎo)致了這個(gè)結(jié)果。處理方法是,用二進(jìn)制打開就沒有這個(gè)問題了。
在這里也比較深的看了一些關(guān)于eof和feof()網(wǎng)上的一些介紹:(只作參考:)一下是引用:eof指endoffile,是超過了文件末尾,文件讀寫都有個(gè)當(dāng)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 能源資源開發(fā)與利用作業(yè)指導(dǎo)書
- 醫(yī)院建設(shè)項(xiàng)目可行性研究
- 公共建筑節(jié)能(綠色建筑)設(shè)計(jì)標(biāo)準(zhǔn)
- 醫(yī)療器械居間銷售提成保證
- 4S店裝修環(huán)保保證金協(xié)議
- 高鐵經(jīng)濟(jì)圈用地購置居間
- 信息化項(xiàng)目可行性研究報(bào)告編制規(guī)范
- 2025年度保健食品個(gè)性化定制配送與市場推廣服務(wù)合同
- 農(nóng)民合作社志愿者招募手冊(cè)
- 低空經(jīng)濟(jì)未來產(chǎn)業(yè)
- 2025年錫林郭勒職業(yè)學(xué)院單招職業(yè)技能測試題庫標(biāo)準(zhǔn)卷
- 2024年湖北省武漢市中考數(shù)學(xué)試題(解析版)
- 低壓變頻器技術(shù)規(guī)范書
- 我的好朋友優(yōu)秀課件
- 松濤水利樞紐設(shè)計(jì)
- 2022版義務(wù)教育(語文)課程標(biāo)準(zhǔn)(含2022年修訂部分)
- 兒童青少年同伴關(guān)系評(píng)級(jí)量表
- 電磁閥基礎(chǔ)知識(shí)培訓(xùn)課件
- 場地清理檢驗(yàn)批質(zhì)量驗(yàn)收及記錄
- 鋼軌超聲波探傷PPT
- 磁共振1.5T和3.0T的差異課件
評(píng)論
0/150
提交評(píng)論