C - Эффективный способ получить количество строк текстового файла. - PullRequest
0 голосов
/ 11 апреля 2020

Я только что нашел эту ветку с тем же вопросом, но в C#.
Как вам этого добиться в C? Есть ли лучшее решение, чем использовать al oop, пока он не достигнет EOF, как это, или в libs уже есть функция, которая может это сделать?

#include <stdio.h>
#include <stdlib.h>

// ----- Macros -----
#define PATHSIZE 255
#define BUFFERPATHSIZE PATHSIZE + 1

// ----- Functions -----
short get_amount_of_lines_of_file(char * path);

// -----======##### CODDE #####=====-----
int main() {

    char buffer[PATHSIZE];
    fgets(buffer, BUFFERPATHSIZE, stdin);

    printf("%d\n", get_amount_of_lines_of_file(buffer));

    return EXIT_SUCCESS;
}

short get_amount_of_lines_of_file(char * path) {
    /*
     * This will return the amount of lines of a file.
     * ----- Variables -----
     * lines: The counter of the lines
     * 
     * ----- Return -----
     * -1: Couldn't open file
     * lines: The amount of lines 
     */

    FILE *file;
    int rofl;
    short lines = 0;

    if ((file = fopen(path, "r")) != NULL) {

        while ((rofl = getc(file)) != EOF) 
            lines++;

        return lines;
    }

    return EXIT_FAILURE;
}

1 Ответ

0 голосов
/ 12 апреля 2020

Если вы хотите быть быстрым, и если ваша память достаточно велика, вы можете прочитать весь файл и проанализировать, чтобы получить количество строк новой строки, попробуйте это: скомпилируйте с gcc -g wc1.c -O3 -o wc1:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef __OSX__
   #define NLINE '\r'
#else
   #define NLINE '\n'
#endif
void main(int argn, char **argv){
  if(argn<2) return;
  FILE *fp=fopen(argv[1],"rb");
  int count=0;
  size_t flen;
  char *nb,*body;

  fseek(fp,0,SEEK_END);
  flen=ftell(fp);
  body=(char*)calloc(1,flen+1);
  fseek(fp,0,SEEK_SET);
  if(fread(body,flen,1,fp)!=1){
    fclose(fp);
    exit(-1);
  }
  fclose(fp);
  nb=body;
  while(nb=strchr(nb,NLINE)){
      count++;
      nb++;
  }
  free(body);
  printf("filename %s: line count %d\n",argv[1],count);
}

в качестве альтернативы, вы также можете установить максимальную ширину линии и вызывать fgets для чтения построчно, попробуйте это: gcc -g wc2.c -O3 -o wc2

#include <stdio.h>
#define MAX_LINE_LENGTH 4096

void main(int argn, char **argv){
  if(argn<2) return;
  FILE *fp=fopen(argv[1],"rt");
  int count=0;
  char line[MAX_LINE_LENGTH];
  while(!feof(fp)){
      if(fgets(line,MAX_LINE_LENGTH,fp))
         count++;
  }
  fclose(fp);
  printf("filename %s: line count %d\n",argv[1],count);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...