再讀標準IO中的讀函數
時間:2016-12-30作者:華清(qing)遠見(jian)
在標(biao)準(zhun)IO中,對(dui)于文(wen)件的(de)讀(du)寫無非三種方式:
(1) 每次一個字符的I / O。 似(si)乎(hu)這(zhe)些(xie)函(han)數(shu)看(kan)起來很簡(jian)單(dan),但只有(you)理解了這(zhe)些(xie)函(han)數(shu),你才知道該(gai)如(ru)何使用,例(li)如(ru)怎樣來判斷讀取的文件是否(fou)結(jie)束,怎樣來統(tong)計文件的行數(shu),等等。 下(xia)(xia)面先來(lai)回(hui)顧下(xia)(xia)讀(du)取文(wen)件的三種方(fang)式,然后(hou)再舉例看下(xia)(xia)怎樣使(shi)用。 一次讀或(huo)寫一個字(zi)符,使用getc、fgetc或(huo)getchar。如(ru)(ru)果(guo)流是帶(dai)緩(huan)存的,則標(biao)準I / O函(han)(han)數處理(li)所(suo)有緩(huan)存。三個函(han)(han)數原型如(ru)(ru)下(xia):
#include <stdio.h> 三(san)個函(han)數的返(fan)回(hui):若成功(gong)則為(wei)下一個字符,若已處文件(jian)尾端(duan)或出錯(cuo)則為(wei)E O F。強調的是(shi)不管是(shi)出錯(cuo)還是(shi)到達(da)文件(jian)尾端(duan),這三(san)個函(han)數都返(fan)回(hui)同(tong)樣的值。為(wei)了區(qu)分這兩種不同(tong)的情(qing)況(kuang),必須調用ferror()或feof()。
一次讀或寫一行,使用f g e t s和gets。兩個函數原型如下: 兩個函數返回:若(ruo)成功(gong)則為(wei)buf,若(ruo)已處文件尾端或出錯則為(wei)null。這兩個函數都指(zhi)定(ding)了緩存地址,讀(du)(du)入(ru)的行將送入(ru)其中。gets()從標準輸入(ru)讀(du)(du),而fgets()則從指(zhi)定(ding)的流讀(du)(du)。 對于fgets(),必(bi)須指定緩(huan)存(cun)的(de)長度為n。此函數一直讀到下一個(ge)新行符(fu)(fu)為止(zhi),但是不超過(guo)n-1個(ge)字(zi)符(fu)(fu),讀入的(de)字(zi)符(fu)(fu)被送入緩(huan)存(cun),該(gai)緩(huan)存(cun)以(yi)null字(zi)符(fu)(fu)結尾。如若該(gai)行,包括后一個(ge)新行符(fu)(fu)的(de)字(zi)符(fu)(fu)數超過(guo)n-1,則只返回一個(ge)不完整的(de)行,而且緩(huan)存(cun)總是以(yi)null字(zi)符(fu)(fu)結尾。對fgets()的(de)下一次(ci)調用會繼續讀該(gai)行。
直接I / O使用的是fread。每次I / O操作讀某種數量的對象,而每個對象具有指定的長度。這個函數常用于從二進制文件中讀一個結構。原型如下: 這(zhe)個(ge)函(han)數(shu)返回:讀的對象(xiang)數(shu)。fputs()在遇到null字(zi)節(jie)時就停止,而(er)(er)在結(jie)構中可能(neng)(neng)含有(you)null字(zi)節(jie),所以不能(neng)(neng)使用每次(ci)(ci)一行(xing)函(han)數(shu)實現這(zhe)種要(yao)求,而(er)(er)fread能(neng)(neng)使我們一次(ci)(ci)讀整個(ge)結(jie)構。 下面看下如何利用上面提到的標準IO讀(du)函數來判斷你讀(du)取的文(wen)件是否結束以及(ji)如何來統計文(wen)件的行數。 1、判斷文件(jian)結束有三種方(fang)式:
a) 當用fgetc(src)返回的int值為EOF時,讀到文件的末尾 實現(xian)起來簡單明了,就不(bu)再(zai)細說(shuo)。 2、統計文件的行數
a) 當用fgetc(src)返回的int值為’\n’時行數加一
程序如下: 發表評論
|