久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

Hi,歡迎來到嵌入式培訓高端品牌 - 華清遠見教育科技集團<北京總部官網>,專注嵌入式工程師培養15年!
當前位置: > 華清遠見教育科技集團 > 嵌入式學習 > 講師博文 > 再讀標準IO中的讀函數
再讀標準IO中的讀函數
時間:2016-12-30作者:華清(qing)遠見(jian)

在標(biao)準(zhun)IO中,對(dui)于文(wen)件的(de)讀(du)寫無非三種方式:

(1) 每次一個字符的I / O。
        (2) 每次一行的I / O。
 &nbsp;    &nbsp; (3) 直接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>
        int getc(FILE *fp) ;
        int fgetc(FILE *fp) ;
         int getchar(void);

三(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。兩個函數原型如下:
        #include <stdio.h>
        Char *gets(char *s) ;
        Char *fgets(char *s,int size,FILE *steam)

兩個函數返回:若(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操作讀某種數量的對象,而每個對象具有指定的長度。這個函數常用于從二進制文件中讀一個結構。原型如下:
        int fread(void * ptr,int objsize,int objnum,FILE *fp);

這(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時,讀到文件的末尾
        b) 當用fgets(p,1024,src)返回的指針為NULL時,讀到文件的末尾
 &nbsp;      c) 當用fread(s,1,20,src)返回的個數(shu)小(xiao)于20時,讀(du)到(dao)文件的末尾

實現(xian)起來簡單明了,就不(bu)再(zai)細說(shuo)。

2、統計文件的行數

a) 當用fgetc(src)返回的int值為’\n’時行數加一
        b) 當用fgets(p,1024,src)返回(hui)的(de)(de)指(zhi)針不為(wei)NULL時,你(ni)的(de)(de)緩沖(chong)即提供的(de)(de)p[1024]已經讀到字(zi)符,這(zhe)個(ge)時候實際上有兩種(zhong)情況,一種(zhong)你(ni)讀進來(lai)(lai)的(de)(de)字(zi)符長(chang)度(du)小于1024個(ge),這(zhe)個(ge)時候一行(xing)結(jie)束(shu),行(xing)數加一,另一種(zhong)比較復雜,由于受自己定義的(de)(de)緩沖(chong)的(de)(de)限制,一次只能讀進來(lai)(lai)1023個(ge),如果恰好(hao)這(zhe)個(ge)時候你(ni)剛好(hao)讀完(wan)一行(xing),那p[]1022]里(li)存(cun)放的(de)(de)一定’\n’,如果不是,那你(ni)的(de)(de)一行(xing)還一定沒有結(jie)束(shu)了。

程序如下:
        Int n;
        A)          While(fgetc(src)==’\n’)
                        N++;
        B)        while(fgets(p,1024,src)!=NULL)
        {
                        If(strlen(p)<1024||p[1022]==’\n’)
                        N++;
  &nbsp;     }

發表評論
評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)