讀取文件行數(shù), 可以逐個(gè)字符讀取文件,到文件尾,統(tǒng)計(jì)\n的個(gè)數(shù)
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括宜州網(wǎng)站建設(shè)、宜州網(wǎng)站制作、宜州網(wǎng)頁制作以及宜州網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,宜州網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到宜州省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
參考代碼如下
#include?stdio.h
int?main()
{
int?c;
FILE?*fp;
int?lines=0;
fp=fopen("in.txt",?"rb");
if(fp)
{
while((c=fgetc(fp))?!=?EOF)
if(c=='\n')?lines++;
printf("%d\n",lines);
fclose(fp);
}
return?0;
}
也可以通過fgets函數(shù),每次讀取一行,到文件尾,然后計(jì)算讀取的次數(shù)
#include?stdio.h
#include?string.h
int?main()
{
char?s[100];
FILE?*fp;
int?lines=0;
fp=fopen("in.txt",?"r");
if(fp)
{
while((fgets(s,100,fp))?!=?NULL)
if(s[strlen(s)-1]=='\n')?lines++;
printf("%d\n",lines);
fclose(fp);
}
return?0;
}
#include?stdio.h
int?hangshu(char?file[])//輸入工程目錄下的文件名,或者其他目錄下絕對(duì)路徑名例如:c:\\1.txt;
{
char?c;
int?h=0;
FILE?*fp;
fp=fopen(file,"r");
if(fp==NULL)
return?-1;//表示文件打開錯(cuò)誤
while((c=fgetc(fp))!=EOF)
{
if(c=='\n')
h++;
else
{
c=fgetc(fp);//這是處理最后一行可能沒有換行標(biāo)志,但是確文件結(jié)束。
if(c==EOF)
{
h++;
break;
}
}
}
return?h;
}
int?main()
{
int?hs=hangshu("c:\\1.txt");//這里說明你要打開的文件。這個(gè)是c盤根目錄下文件
int?hst=hangshu("1.txt");//工程目錄下的文件。
printf("行數(shù):%d\n",hs);
printf("行數(shù):%d\n",hs);
}
如上是用c編寫的,不是c++.
運(yùn)行的時(shí)候可以把中文注釋去掉。
完全可以運(yùn)行的,我已經(jīng)測(cè)試過了。
統(tǒng)計(jì)行數(shù)可以通過統(tǒng)計(jì)換行符\n來實(shí)現(xiàn)。不過需要注意的是,有些文件最后一行并不存在換行符,所以代碼中需要對(duì)此作處理。
可以在達(dá)到文件結(jié)尾后,判斷前一個(gè)字符,如果不是換行符,那么應(yīng)補(bǔ)加最后一行統(tǒng)計(jì)。
代碼如下:
假定輸入文件為in.txt,該文件存在且可讀。
#include?stdio.h
int?main()
{
FILE?*?fp?=?NULL;?//文件指針。
int?c,?lc=0;?//c為文件當(dāng)前字符,lc為上一個(gè)字符,供結(jié)尾判斷用。
int?line?=?0;?//行數(shù)統(tǒng)計(jì)
fp?=?fopen("in.txt",?"r");//以只讀方式打開文件。
while((c?=?fgetc(fp))?!=?EOF)?//逐個(gè)讀入字符直到文件結(jié)尾
{
if(c?==?'\n')?line?++;?//統(tǒng)計(jì)行數(shù)。
lc?=?c;?//保存上一字符。
}
fclose(fp);?//關(guān)閉文件
if(lc?!=?'\n')?line?++;//處理末行
printf("文件共有%d行。\n",?line);
return?0;
}
樣例輸入輸出:
如in.txt有如下內(nèi)容:
test?line1
test?line2
則會(huì)輸出:
文件共有2行。
代碼中有兩個(gè)問題:
(1)while(){}語法問題。
while(條件)/////這后面不能加分號(hào),加分號(hào)后將做空循環(huán),循環(huán)里不會(huì)執(zhí)行循環(huán)體的代碼
{
循環(huán)體;
}
把while()后面的分號(hào)";"去掉就好。
(2)while里面的條件(c=fgetc(fp) !=EOF) 有問題。按照C語言運(yùn)算符的優(yōu)先級(jí)將按以下順序執(zhí)行這個(gè)while循環(huán)里面的語句:
1) 讀取文件: fgetc(fp)
2) 將讀取文件的結(jié)果與EOF比較: fgetc(fp) !=EOF
3) 將比較的結(jié)果賦值給c,就是說c每次得到的不是true(1)就是false(0),根本不是你想要的結(jié)果
這個(gè)表達(dá)式其實(shí)是:while (c = (fgetc(fp) != EOF) )
正確的寫法是:while ( (c = fgetc(fp)) != EOF)
所以最后的代碼修改如下:
#includestdio.h
main()
{
FILE *fp;
char name[100],c;
int i;
int count = 0;//計(jì)算文件中字符個(gè)數(shù),從而判斷是否為空文件
i=0;//這邊為什么初始化為1?如果輸入的是空文件那么應(yīng)該就是0行
printf("enter filename:");
gets(name);
fp=fopen( name ,"r");
if (fp != NULL)
while ( (c=fgetc(fp)) != EOF )
{
count ++;
if(c == '\n')
i++;
}
if(i == 0 count 0) i ++; //如果沒有'\n'但是文件非空,那么該文件只有一行
printf("number of numbers:%d\n",i);
}
當(dāng)然,僅僅判斷'\n'并不保險(xiǎn),并不是所有系統(tǒng)下面的換行都有'\n',比如dos系統(tǒng)是"\r\n", linux系統(tǒng)一般用'\n',蘋果系統(tǒng)用的是'\r',如果是蘋果系統(tǒng)這種做法就失效了。
當(dāng)前文章:c語言文件行數(shù)函數(shù) c語言有關(guān)文件的函數(shù)
網(wǎng)頁地址:http://aaarwkj.com/article2/hhhhoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、網(wǎng)站營銷、外貿(mào)網(wǎng)站建設(shè)、電子商務(wù)、網(wǎng)站建設(shè)、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)