统计行数可以通过统计换行符\n来实现。不过需要注意的是,有些文件最后一行并不存在换行符,所以代码中需要对此作处理。
可以在达到文件结尾后,判断前一个字符,如果不是换行符,那么应补加最后一行统计。
代码如下:
假定输入文件为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 line1test line2
则会输出:
文件共有2行。
代码中有两个问题:(1)while(){}语法问题。
while(条件)/////这后面不能加分号,加分号后将做空循环,循环里不会执行循环体的代码
{
循环体
}
把while()后面的分号""去掉就好。
(2)while里面的条件(c=fgetc(fp) !=EOF) 有问题。按照C语言运算符的优先级将按以下顺序执行这个while循环里面的语句:
1) 读取文件: fgetc(fp)
2) 将读取文件的结果与EOF比较: fgetc(fp) !=EOF
3) 将比较的结果赋值给c,就是说c每次得到的不是true(1)就是false(0),根本不是你想要的结果
这个表达式其实是:while (c = (fgetc(fp) != EOF) )
正确的写法是:while ( (c = fgetc(fp)) != EOF)
所以最后的代码修改如下:
#include<stdio.h>
main()
{
FILE *fp
char name[100],c
int i
int count = 0//计算文件中字符个数,从而判断是否为空文件
i=0//这边为什么初始化为1?如果输入的是空文件那么应该就是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)
}
当然,仅仅判断'\n'并不保险,并不是所有系统下面的换行都有'\n',比如dos系统是"\r\n", linux系统一般用'\n',苹果系统用的是'\r',如果是苹果系统这种做法就失效了。