日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 工業(yè)控制 > 電子設(shè)計自動化
[導(dǎo)讀]作者:王姍姍,華清遠(yuǎn)見嵌入式學(xué)院講師。 在標(biāo)準(zhǔn)IO中,對于文件的讀寫無非三種方式: (1) 每次一個字符的I / O。 (2) 每次一行的I / O。 (3) 直接I / O。 似乎這些函數(shù)看起來很簡單,但只有理解了這些函數(shù),你才知道該

作者:王姍姍,華清遠(yuǎn)見嵌入式學(xué)院講師。

在標(biāo)準(zhǔn)IO中,對于文件的讀寫無非三種方式:

(1) 每次一個字符的I / O。

(2) 每次一行的I / O。

(3) 直接I / O。

似乎這些函數(shù)看起來很簡單,但只有理解了這些函數(shù),你才知道該如何使用,例如怎樣來判斷讀取的文件是否結(jié)束,怎樣來統(tǒng)計文件的行數(shù),等等。

下面先來回顧下讀取文件的三種方式,然后再舉例看下怎樣使用。

一次讀或?qū)懸粋€字符,使用getc、fgetc或getchar。如果流是帶緩存的,則標(biāo)準(zhǔn)I / O函數(shù)處理所有緩存。三個函數(shù)原型如下:

#include <stdio.h>

int getc(FILE *fp) ;

int fgetc(FILE *fp) ;

int getchar(void);

三個函數(shù)的返回:若成功則為下一個字符,若已處文件尾端或出錯則為E O F。強調(diào)的是不管是出錯還是到達(dá)文件尾端,這三個函數(shù)都返回同樣的值。為了區(qū)分這兩種不同的情況,必須調(diào)用ferror()或feof()。

一次讀或?qū)懸恍?,使用f g e t s和gets。兩個函數(shù)原型如下:

#include <stdio.h>

Char *gets(char *s) ;

Char *fgets(char *s,int size,FILE *steam)

兩個函數(shù)返回:若成功則為buf,若已處文件尾端或出錯則為null。這兩個函數(shù)都指定了緩存地址,讀入的行將送入其中。gets()從標(biāo)準(zhǔn)輸入讀,而fgets()則從指定的流讀。

對于fgets(),必須指定緩存的長度為n。此函數(shù)一直讀到下一個新行符為止,但是不超過n-1個字符,讀入的字符被送入緩存,該緩存以null字符結(jié)尾。如若該行,包括最后一個新行符的字符數(shù)超過n-1,則只返回一個不完整的行,而且緩存總是以null字符結(jié)尾。對fgets()的下一次調(diào)用會繼續(xù)讀該行。

直接I / O使用的是fread。每次I / O操作讀某種數(shù)量的對象,而每個對象具有指定的長度。這個函數(shù)常用于從二進(jìn)制文件中讀一個結(jié)構(gòu)。原型如下:

int fread(void * ptr,int objsize,int objnum,FILE *fp);

這個函數(shù)返回:讀的對象數(shù)。fputs()在遇到null字節(jié)時就停止,而在結(jié)構(gòu)中可能含有null字節(jié),所以不能使用每次一行函數(shù)實現(xiàn)這種要求,而fread能使我們一次讀整個結(jié)構(gòu)。

下面看下如何利用上面提到的標(biāo)準(zhǔn)IO讀函數(shù)來判斷你讀取的文件是否結(jié)束以及如何來統(tǒng)計文件的行數(shù)。

1、判斷文件結(jié)束有三種方式:

a) 當(dāng)用fgetc(src)返回的int值為EOF時,讀到文件的末尾

b) 當(dāng)用fgets(p,1024,src)返回的指針為NULL時,讀到文件的末尾

c) 當(dāng)用fread(s,1,20,src)返回的個數(shù)小于20時,讀到文件的末尾

實現(xiàn)起來簡單明了,就不再細(xì)說。

2、統(tǒng)計文件的行數(shù)

a) 當(dāng)用fgetc(src)返回的int值為’n’時行數(shù)加一

b) 當(dāng)用fgets(p,1024,src)返回的指針不為NULL時,你的緩沖即提供的p[1024]已經(jīng)讀到字符,這個時候?qū)嶋H上有兩種情況,一種你讀進(jìn)來的字符長度小于1024個,這個時候一行結(jié)束,行數(shù)加一,另一種比較復(fù)雜,由于受自己定義的緩沖的限制,一次只能讀進(jìn)來1023個,如果恰好這個時候你剛好讀完一行,那p[]1022]里存放的一定’n’,如果不是,那你的一行還一定沒有結(jié)束了。

程序如下:

Int n;

A) While(fgetc(src)==’n’)

N++;

B) while(fgets(p,1024,src)!=NULL)

{

If(strlen(p)<1024||p[1022]==’n’)

N++;

}
“本文由華清遠(yuǎn)見http://www.embedu.org/index.htm提供”



來源:華清遠(yuǎn)見0次

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉