用C语言计算文件中的空行

问题描述 投票:0回答:1

有没有办法用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);
}
c file file-handling fseek
1个回答
1
投票

首先,让我们定义一个结构来保存行统计,这样我们就可以从函数中返回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 胜过 fseeking)。
  • 我选择用 while (1) 附带 break 在这里,因为我认为它更符合程序的工作方式。请注意,如果一个文件的最后一行没有正确地以换行符结束,它将不会被考虑。
  • 你应该抓住给定文件无法打开阅读的情况。一旦你有了 fopen您必须确保 fclose 它以后。

0
投票

所以我写了这段新的代码,我做的不是计算空白行,而是计算总行数和填充行数,然后从总行数中减去填充行数,这样就完美了。

下面是代码

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.