Подсчет пустых строк из файла в C - PullRequest
0 голосов
/ 30 апреля 2020

Есть ли способ подсчитать общее количество пустых строк в файле на языке 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);
}

Я использую fget c для чтения файлов charcater по charcater, когда fget c встречает \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);
}

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Сначала давайте определим структуру для хранения статистики строк, чтобы мы могли вернуть t из функции:

struct linestat {
    size_t total;
    size_t blank;
};

Далее, давайте определим, что составляет пустую строку. Ваше определение двух последовательных символов новой строки это нормально, но довольно узко, поэтому допустим, что пустая строка состоит только из пробелов и заканчивается символом новой строки. Вы можете определить, является ли символ c пробелом или нет, с помощью функции isspace(c) из <ctype.h>.

Вы можете go об этом по-разному. Вот один из способов:

Сканирование строки до появления символа новой строки и отслеживание того, встречаются ли на вашем пути пробелы. Переписал эту строку в вашей статистике. повторение. Вы также должны проверить, встречаете ли вы 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;
}

Примечания:

  • Алгоритм отслеживает то, что он видит на пути, так что Вам никогда не придется прыгать назад в файл. (Иногда бывает полезно сделать это и сделать непрочитанным один символ. В таких случаях ungetc лучше, чем fseek ing.)
  • Я решил использовать while (1) с break здесь, потому что я думаю, что это соответствует тому, как процедура работает лучше. Обратите внимание, что последняя строка файла не будет учитываться, если он не завершен должным образом символом новой строки.
  • Вам следует обратить внимание на случай, когда данный файл не может быть открыт для чтения. После того, как вы fopen отредактировали файл, вы должны fclose сделать это позже.
0 голосов
/ 30 апреля 2020

Итак, я пришел с этим новым кодом, вместо того, чтобы подсчитывать пустые строки, я подсчитывал общее количество строк и общее количество заполненных строк, а затем вычитал заполненные строки из общего количества строк, и он отлично работает, я не знаю почему предыдущий код не работал, что было предложено @MOehm, может быть связано с проблемой компилятора или я не знаю.

Вот код

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);
}
...