统计行数可以通过统计换行符\n来实现。不过需要注意的是,有些文件最后一行并不存在换行符,所以代码中需要对此作处理。
成都创新互联公司是专业的陆良网站建设公司,陆良接单;提供网站制作、网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行陆良网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
可以在达到文件结尾后,判断前一个字符,如果不是换行符,那么应补加最后一行统计。
代码如下:
假定输入文件为in.txt,该文件存在且可读。
#include stdio.h
int main()
{
FILE * fp = NULL; //文件指针。
int c, lc=0; //c为文件当前字符,lc为上一个字符,供结尾判断用。
int line = 0; //行数统计
fp = fopen("in.txt", "r");//以只读方式打开文件。
while((c = fgetc(fp)) != EOF) //逐个读入字符直到文件结尾
{
if(c == '\n') line ++; //统计行数。
lc = c; //保存上一字符。
}
fclose(fp); //关闭文件
if(lc != '\n') line ++;//处理末行
printf("文件共有%d行。\n", line);
return 0;
}
样例输入输出:
如in.txt有如下内容:
test line1
test line2
则会输出:
文件共有2行。
使用fopen函数打开文件,使用fgetc()一个字符一个字符的读取,然后计数统计就可以啦,fget()从文件指针stream指向的文件中读取一个字符,读取一个字节后,光标位置后移一个字节,这个函数的返回值,是返回所读取的一个字节。如果读到文件末尾或者读取出错时返回EOF。
#includestdio.h
int main()
{
FILE *fp;
char filename[50];
int num=0;
printf("输入一个文件名: ");
gets(filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("文件打开失败..\n");
return ;
}
while(!feof(fp))fgetc(fp)num++;
printf("%s 文件中共有字符个数: %d\n",filename,num);
fclose(fp);
return ;
}
使用文件读取操作,每次读一行,使用一个变量进行统计没进一次循环变量累积加1
给你一个demo,这个demo是每次读一行文本,通过转化操作后存入另一个文本里面
#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) // 输入重定向,第一个参数为文件的路径
{
char first_line[100];
gets(first_line); // 读取文件第一行
char* token = strtok(first_line, " "); // 空格是分割符(一个或多个空格效果一样)
char courses[10][20]; // 假设最多十门课
int count = 0;
while ( token != NULL )
{
token = strtok( NULL, " "); // 获得下一个 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;
}
运行:
楼主你好
具体代码如下:
#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("输入统计的汉字:");
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])
//一个汉字占两个字节 所以需要判断两个字节的内容
count++;
}
printf("%d\n", count);
return 0;
}
如果word.txt中包含的内容为:你好吗 你 你
输入:你
输出:3
希望能帮助你哈
汉字机内码在计算机的表达方式的描述是,使用二个字节,每个字节最高位一位为1.
计算机中,补码第一位是符号位,1
表示为负数,所以
汉字机内码的每个字节表示的十进制数都是负数
所以这题也就可以简化为输入字符串判断其中字符转化为十进制数是否小于零.
注意:汉字是有两个小于零的字符组成,所以在统计结果的时候就要将count除以2了.
#include
stdio.h
int
main(void)
{
int
count;
char
c;
while(1){
count
=
0;
while
((c
=
getchar())
!=
'\n')//逐个判断字符,汉字的是两个字符
{
if
(c
0)
count++;
}
printf("%d\n",
count
/
2);
}
return
0;
}
getchar()函数:从stdio流中读字符,相当于getc(stdin),它从标准输入里读取下一个字符.
getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdin流中每次读入一个字符.getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.
注意:如果输入的是中文字符,由于汉字是两个字节,所以getchar()函数对汉字要处理两次.比如我输入2个汉字,getchar()处理4次,返回4个值,由于是中文返回的肯定是负数.