統(tǒng)計(jì)行數(shù)可以通過統(tǒng)計(jì)換行符\n來實(shí)現(xiàn)。不過需要注意的是,有些文件最后一行并不存在換行符,所以代碼中需要對(duì)此作處理。
成都創(chuàng)新互聯(lián)公司是專業(yè)的陸良網(wǎng)站建設(shè)公司,陸良接單;提供網(wǎng)站制作、網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行陸良網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
可以在達(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行。
使用fopen函數(shù)打開文件,使用fgetc()一個(gè)字符一個(gè)字符的讀取,然后計(jì)數(shù)統(tǒng)計(jì)就可以啦,fget()從文件指針stream指向的文件中讀取一個(gè)字符,讀取一個(gè)字節(jié)后,光標(biāo)位置后移一個(gè)字節(jié),這個(gè)函數(shù)的返回值,是返回所讀取的一個(gè)字節(jié)。如果讀到文件末尾或者讀取出錯(cuò)時(shí)返回EOF。
#includestdio.h
int?main()
{
FILE?*fp;
char?filename[50];
int?num=0;
printf("輸入一個(gè)文件名:?");
gets(filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("文件打開失敗..\n");
return?;
}
while(!feof(fp))fgetc(fp)num++;
printf("%s?文件中共有字符個(gè)數(shù):?%d\n",filename,num);
fclose(fp);
return?;
}
使用文件讀取操作,每次讀一行,使用一個(gè)變量進(jìn)行統(tǒng)計(jì)沒進(jìn)一次循環(huán)變量累積加1
給你一個(gè)demo,這個(gè)demo是每次讀一行文本,通過轉(zhuǎn)化操作后存入另一個(gè)文本里面
#includestdio.h
int?main()
{
char?buffer[1024];
unsigned?char?hex[16];
unsigned?char?num1,num2,num3,num4,num5,num6,num7,num8,num9,num10,num11,num12,num13,num14,num15,num16;
char?bs[6];
char?bs1[20];
FILE?*?file;
file=fopen(?"boot1.read",?"rb+");??
if(file?==?NULL){
printf("file?open?error!\n");
return?0;
}???
FILE?*?file1;
file1=fopen(?"tt.read",?"ab+");??
if(file1?==?NULL){
printf("file?open?error!\n");
fclose(file);
return?0;
}???
while(fgets(buffer,?1024,?file)?!=?NULL){
sscanf(buffer,"%bs?%x?%x?%x?%x?%x?%x?%x?%x?%x?%x?%x?%x?%x?%x?%x?%x????%s",s,num1,num2,num3,num4,num5,num6,num7,num8,num9,num10,num11,num12,num13,num14,num15,num16,bs1);
hex[0]=num1;
hex[1]=num2;
hex[2]=num3;
hex[3]=num4;
hex[4]=num5;
hex[5]=num6;
hex[6]=num7;
hex[7]=num8;
hex[8]=num9;
hex[9]=num10;
hex[10]=num11;
hex[11]=num12;
hex[12]=num13;
hex[13]=num14;
hex[14]=num15;
hex[15]=num16;
fwrite((unsigned?char?*)hex,sizeof(hex),1,file1);
}???
fclose(file1);
fclose(file);
return?0;
}
看代碼:
#include?stdio.h
#include?string.h
int?main(int?argc,?char**?argv)
{
char?s[100];
if?(?freopen("score.txt",?"r",?stdin)?!=?NULL)?//?輸入重定向,第一個(gè)參數(shù)為文件的路徑
{
char?first_line[100];
gets(first_line);?//?讀取文件第一行
char*?token?=?strtok(first_line,?"?");?//?空格是分割符(一個(gè)或多個(gè)空格效果一樣)
char?courses[10][20];?//?假設(shè)最多十門課
int?count?=?0;
while?(?token?!=?NULL?)
{
token?=?strtok(?NULL,?"?");?//?獲得下一個(gè)?token
if?(token?!=?NULL)
{
strcpy(courses[count++],?token);
}
}
int?i;
printf?("總共?%d?門課:\n",?count);
for?(i?=?0;?i? count;?++i)
{
printf?("%s\n",?courses[i]);
}
}
else
{
printf?("文件不存在!\n");
}
return?0;
}
運(yùn)行:
樓主你好
具體代碼如下:
#includestdio.h
#includestdlib.h
#includestring.h
#define N 40
int main()
{
int i,count = 0;
char *cSource,*cSearch;
FILE *fp;
cSource = (char *)malloc(N * sizeof(char));
cSearch = (char *)malloc(3 * sizeof(char));
if((fp = fopen("word.txt", "r")) == NULL)
{
printf("文件打開失敗!\n");
exit(0);
}
printf("輸入統(tǒng)計(jì)的漢字:");
scanf("%s", cSearch);
fgets(cSource, N, fp);
for(i = 0; i (int)strlen(cSource); i++)
{
if(cSource[i] == cSearch[0] cSource[i+1] == cSearch[1])
//一個(gè)漢字占兩個(gè)字節(jié) 所以需要判斷兩個(gè)字節(jié)的內(nèi)容
count++;
}
printf("%d\n", count);
return 0;
}
如果word.txt中包含的內(nèi)容為:你好嗎 你 你
輸入:你
輸出:3
希望能幫助你哈
漢字機(jī)內(nèi)碼在計(jì)算機(jī)的表達(dá)方式的描述是,使用二個(gè)字節(jié),每個(gè)字節(jié)最高位一位為1.
計(jì)算機(jī)中,補(bǔ)碼第一位是符號(hào)位,1
表示為負(fù)數(shù),所以
漢字機(jī)內(nèi)碼的每個(gè)字節(jié)表示的十進(jìn)制數(shù)都是負(fù)數(shù)
所以這題也就可以簡(jiǎn)化為輸入字符串判斷其中字符轉(zhuǎn)化為十進(jìn)制數(shù)是否小于零.
注意:漢字是有兩個(gè)小于零的字符組成,所以在統(tǒng)計(jì)結(jié)果的時(shí)候就要將count除以2了.
#include
stdio.h
int
main(void)
{
int
count;
char
c;
while(1){
count
=
0;
while
((c
=
getchar())
!=
'\n')//逐個(gè)判斷字符,漢字的是兩個(gè)字符
{
if
(c
0)
count++;
}
printf("%d\n",
count
/
2);
}
return
0;
}
getchar()函數(shù):從stdio流中讀字符,相當(dāng)于getc(stdin),它從標(biāo)準(zhǔn)輸入里讀取下一個(gè)字符.
getchar有一個(gè)int型的返回值.當(dāng)程序調(diào)用getchar時(shí).程序就等著用戶按鍵.用戶輸入的字符被存放在鍵盤緩沖區(qū)中.直到用戶按回車為止(回車字符也放在緩沖區(qū)中).當(dāng)用戶鍵入回車之后,getchar才開始從stdin流中每次讀入一個(gè)字符.getchar函數(shù)的返回值是用戶輸入的第一個(gè)字符的ASCII碼,如出錯(cuò)返回-1,且將用戶輸入的字符回顯到屏幕.如用戶在按回車之前輸入了不止一個(gè)字符,其他字符會(huì)保留在鍵盤緩存區(qū)中,等待后續(xù)getchar調(diào)用讀取.也就是說,后續(xù)的getchar調(diào)用不會(huì)等待用戶按鍵,而直接讀取緩沖區(qū)中的字符,直到緩沖區(qū)中的字符讀完為后,才等待用戶按鍵.
注意:如果輸入的是中文字符,由于漢字是兩個(gè)字節(jié),所以getchar()函數(shù)對(duì)漢字要處理兩次.比如我輸入2個(gè)漢字,getchar()處理4次,返回4個(gè)值,由于是中文返回的肯定是負(fù)數(shù).