#include?stdio.h

召陵ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
int?hangshu(char?file[])//輸入工程目錄下的文件名,或者其他目錄下絕對路徑名例如:c:\\1.txt;
{
char?c;
int?h=0;
FILE?*fp;
fp=fopen(file,"r");
if(fp==NULL)
return?-1;//表示文件打開錯誤
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");//這里說明你要打開的文件。這個是c盤根目錄下文件
int?hst=hangshu("1.txt");//工程目錄下的文件。
printf("行數(shù):%d\n",hs);
printf("行數(shù):%d\n",hs);
}
如上是用c編寫的,不是c++.
運行的時候可以把中文注釋去掉。
完全可以運行的,我已經(jīng)測試過了。
1、用fgets函數(shù)可以讀取文件中某行的數(shù)據(jù),某列數(shù)據(jù)就必須一個一個讀入每行的第幾個字符,再存入到一個字符串當(dāng)中。
2、例程:
#includestdio.h
#includestring.h
void?main()
{
char?a[100],b[100],c[100];
int?i=3,j=4,k=0;????//第三行,第四列
FILE?*fp?=?fopen("data.txt","r");
while(fgets(c,100,fp)){????//讀入每行數(shù)據(jù)
i--;
if(i==0)?strcpy(a,c);????//讀到第三行數(shù)據(jù)
b[k++]=c[j-1];????????//把每行的那列字符拷到b中
}
b[k]=0;
printf("第%d行數(shù)據(jù):%s\n",i,a);
printf("第%d列數(shù)據(jù):%s\n",j,b);
fclose(fp);
}
讀取文件行數(shù), 可以逐個字符讀取文件,到文件尾,統(tǒng)計\n的個數(shù)
參考代碼如下
#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ù),每次讀取一行,到文件尾,然后計算讀取的次數(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;
}
代碼中有兩個問題:
(1)while(){}語法問題。
while(條件)/////這后面不能加分號,加分號后將做空循環(huán),循環(huán)里不會執(zhí)行循環(huán)體的代碼
{
循環(huán)體;
}
把while()后面的分號";"去掉就好。
(2)while里面的條件(c=fgetc(fp) !=EOF) 有問題。按照C語言運算符的優(yōu)先級將按以下順序執(zhí)行這個while循環(huán)里面的語句:
1) 讀取文件: fgetc(fp)
2) 將讀取文件的結(jié)果與EOF比較: fgetc(fp) !=EOF
3) 將比較的結(jié)果賦值給c,就是說c每次得到的不是true(1)就是false(0),根本不是你想要的結(jié)果
這個表達(dá)式其實是:while (c = (fgetc(fp) != EOF) )
正確的寫法是:while ( (c = fgetc(fp)) != EOF)
所以最后的代碼修改如下:
#includestdio.h
main()
{
FILE *fp;
char name[100],c;
int i;
int count = 0;//計算文件中字符個數(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'并不保險,并不是所有系統(tǒng)下面的換行都有'\n',比如dos系統(tǒng)是"\r\n", linux系統(tǒng)一般用'\n',蘋果系統(tǒng)用的是'\r',如果是蘋果系統(tǒng)這種做法就失效了。
很遺憾,事實上計算機是不可能做到讀取txt文件的第n行的時間復(fù)雜度為O(1)的。
因為txt文件是“順序存儲”,如圖參考自《數(shù)據(jù)結(jié)構(gòu)》
要讀取第n行,必須找到第n-1行 = 則必須找到n-2行 … 必須找到第1行。所以讀取第5000行的字符串,只能一行一行找,就好比人類看書,要看到第5000段( txt的第5000行 其實打印出來是第5000段)必須一段一段數(shù),不然只能估計,就不準(zhǔn)確了。
如果要以O(shè)(1)時間復(fù)雜度定位到第N“行”或第N個記錄,必須用“索引存儲”、“散列存儲”等,如數(shù)據(jù)庫文件會用這類存儲。具體細(xì)節(jié)可以學(xué)《數(shù)據(jù)結(jié)構(gòu)》、《數(shù)據(jù)庫原理》等。
參考代碼:
#include?stdio.h?
//讀取filename文件(路徑)、第?whichLine+1?行文本。
char?*?ReadSpeacialLine(char?*filename,?int?whichLine)
{
FILE?*fp;???????
int?currentLine?=?0; //當(dāng)前讀取的行
char?strLine[1024]; //每行最大讀取的字符數(shù),可根據(jù)實際情況擴(kuò)大
if?((fp?=?fopen(filename,?"r"))?==?NULL)?//判斷文件是否存在及可讀
{
printf("error!");
return?NULL;
}
while?(!feof(fp))
{
if?(currentLine?==?whichLine)
{
fgets(strLine,?1024,?fp);??//讀取一行
//printf("%s",?strLine);?//輸出
return?strLine;
}
fgets(strLine,?1024,?fp);??//讀取一行,并定位到下一行
currentLine++;
}
fclose(fp);?????????????????????//關(guān)閉文件
return?NULL;
}
int?main()?{
//注意?源代碼里字符串寫"\\",編譯之后只是1個\,因為\是轉(zhuǎn)義符號
char?txtFile[]?=?"E:\\新建文本文檔.txt";
int?i?=?11;
printf("第%d行\(zhòng)n%s",?i+1
,?ReadSpeacialLine(txtFile,?i)); //ReadSpeacialLine返回的字符串里自帶換行
getchar(); //防止結(jié)束閃退
return?0;
}
網(wǎng)站標(biāo)題:c語言讀取行數(shù)的函數(shù),c++讀取行
網(wǎng)頁鏈接:http://chinadenli.net/article30/dsgoepo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、網(wǎng)站設(shè)計公司、用戶體驗、電子商務(wù)、外貿(mào)網(wǎng)站建設(shè)、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)