有没有办法用C语言计算一个文件中的空行总数。我一直在尝试,下面是我的代码,但是没有用。
void countLines(char *f1)
{
FILE *fp;
fp=fopen(f1,"r");
int d=fgetc(fp),count=0,countbl=0;
while(d != EOF)
{
if(d=='\n')
{
d=fgetc(fp);
if(d=='\n')
countbl++;
count++;
fseek(fp,-1,SEEK_CUR);
}
d=fgetc(fp);
}
printf("%d %d",count+1,countbl);
}
我在使用fgetc读取文件charcater时,当fgetc遇到了 \n
我检查下一个字符是否又是 \n
这意味着它是空行,但它是不工作的。
样品输入
fileCount.txt(name of text file)
文件内容
This is line one
Hello, welcome to programming
Code quotient - Get better at coding
b
采样输出
8 4
这里8是总行数,4是总空行数。
以下是新的代码,但仍然无法使用。
void countLines(char *f1)
{
FILE *fp;
fp=fopen(f1,"r");
int d=fgetc(fp),count=0,countbl=0,temp=0;
while(d != EOF)
{
//printf("%c %c",temp ,d);
if(d=='\n' && temp=='\n' )
countbl++;
if(d=='\n')
count++;
temp=d;
d=fgetc(fp);
}
printf("%d %d",count+1,countbl);
}
首先,让我们定义一个结构来保存行统计,这样我们就可以从函数中返回t。
struct linestat {
size_t total;
size_t blank;
};
接下来,让我们定义一下什么是空行。你对两个连续的换行符的定义是可以的,但是比较狭隘,所以我们说空行只由空格字符组成,并且以一个换行符结束。您可以确定一个字符是否 c
是否使用函数 isspace(c)
从 <ctype.h>
.
你可以用不同的方法来解决这个问题。这里有一种方法。
扫描一行,直到看到一个新行的字符,并跟踪你是否遇到非空格的方式。在你的统计中重新记录这一行,重复。你也必须检查你是否遇到了 EOF
的,当然。
struct linestat count_lines(const char *filename)
{
struct linestat ls = {0, 0};
FILE *fp = fopen(filename, "r");
if (fp == 0) return ls;
while (1) {
int blank = 1;
int c = fgetc(fp);
while (c != EOF && c != '\n') {
if (isspace(c) == 0) blank = 0;
c = fgetc(fp);
}
if (c == EOF) break;
ls.total++;
if (blank) ls.blank++;
}
fclose(fp);
return ls;
}
Notes:
ungetc
胜过 fseek
ing)。while (1)
附带 break
在这里,因为我认为它更符合程序的工作方式。请注意,如果一个文件的最后一行没有正确地以换行符结束,它将不会被考虑。fopen
您必须确保 fclose
它以后。所以我写了这段新的代码,我做的不是计算空白行,而是计算总行数和填充行数,然后从总行数中减去填充行数,这样就完美了。
下面是代码
void countLines(char *f1)
{
FILE *fp;
fp=fopen(f1,"r");
int count=0,countbl=0;
char str[200],*c1;
c1=fgets(str,200,fp);
while(c1 != NULL)
{
if(c1[0]>=32 && c1[0]<=127)
countbl++;
c1=fgets(str,200,fp);
count++;
}
printf(" %d %d",count,count-countbl);
}