Je voudrais savoir si vous connaissiez une petite méthode pour connaitre le nombre de ligne dans un fichier texte, meme avec une commande systeme
Je voudrais savoir si vous connaissiez une petite méthode pour connaitre le nombre de ligne dans un fichier texte, meme avec une commande systeme
Il existe bien des commandes systèmes, mais ca dépénd du système !
Il doit pouvoir fonctionner sous Window et Unix.
Etre tres rapide.
Utiliser fgets alors... Ou alors, utiliser des #ifdef pour savoir sous quel OS tu te trouves et utiliser wc sous unix par exemple...Envoyé par theshark85
Jc
Sous unix :Sous windows, je ne sais pas. En installant cygwin, tu as la même commande que ci-dessus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part wc -l
Ceci doit etre portable, donc pas de possibilité d'installer des biblio ou autres.
Avec fgets entre 2 et 3 minutes pour 11 100 000 lignes. Qui dit mieux!!!
Voici une fonction que j'ai y'a un ptit moment maintenant, je pense qu'elle peut être optimisé, a voir !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 int c_file_nb_lines (char const * const s_filename) { FILE * p_file = NULL; char * s_line = NULL; int nb_lines = 0; /* ----- Ouverture du fichier ----- */ p_file = fopen (s_filename, "r"); if (!p_file) { /* Erreur: impossible d'ouvrir le fichier. */ return -1; } /* ----- */ /* ----- Allocation d'un tableau pour contenir la ligne ----- */ s_line = malloc (MAX_LENGHT); if (!s_line) { /* Erreur: impossible d'allouer l'espace requis. */ fclose (p_file); return -1; } /* ----- */ /* ----- Lecture de la ligne du fichier ----- */ while (fgets (s_line, MAX_LENGHT, p_file)) { memset (s_line, 0, sizeof (s_line)); nb_lines++; } if (ferror (p_file)) { /* Erreur pendant la lecture du fichier. */ return -1; } /* ----- */ /* ----- Fermeture du fichier ----- */ fclose (p_file); /* ----- */ return nb_lines; }
Mon Site
Ma bibliothèque de gestion des chaînes de caractères en C
L'imagination est plus importante que le savoir. A. Einstein
Je ne répond à aucune question technique par MP, merci d'avance !
Aller un challenge...Envoyé par theshark85
Voici comment j'ai créé le fichier test:
En créant un fichier de 50 meg, j'ai:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 #include <stdio.h> #include <time.h> int main(int argc, char **argv) { int size,i; int cnt=0; srand(time(NULL)); if(argc!=2) { printf("Error dans la ligne de commande\n"); return 1; } printf("Creating file size\n"); size= strtol(argv[1],NULL,0); printf("Creating file size: %d\n",size); FILE *f = fopen("filetotest","w"); if(f==NULL) { printf("Error\n"); return 1; } for(i=0;i<size;i++) { if(rand()%500>350) {cnt++;fprintf(f,"\n");} else fprintf(f,"_"); } printf("Created %d lines\n",cnt); fclose(f); }
En utilisant ce programme:~/tmp$ ./createf 50000000
Creating file size
Creating file size: 50000000
Created 14894826 lines
J'obtiens:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 #include <stdlib.h> #include <stdio.h> #define N 4096 int main(int argc, char **argv) { char buf[N]; int i,size; int cnt=0; if(argc!=2) return 1; FILE *f = fopen(argv[1],"r"); if(f==NULL) return 1; while((size=fread(buf,1,N,f))>0) { for(i=0;i<size;i++) { if(buf[i]=='\n') cnt++; } } fclose(f); printf("Lignes: %d\n",cnt); return 0; }
Donc, je dis mieux...~/tmp$ time ./a.out filetotest
Lignes: 14894826
real 0m0.152s
user 0m0.120s
sys 0m0.027s
Jc
On a bien dit compter les lignes ? Pourquoi les charger ? Il suffit de compter les délimiteurs...Envoyé par theshark85
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 #include<stdio.h> #define fname "fichier.txt" int main() { FILE *fp = fopen(fname, "r"); if (fp != NULL) { unsigned long count = 0; int c; while ((c = fgetc(fp)) != EOF) { if (c == '\n') { count++; } } fclose(fp); printf("%lu lines\n", count); } else { perror(fname); } return 0; }
Partager