Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

compter le nombre de lignes d'un fichier

24 réponses
Avatar
Zulfukar Arslan
Bonjour a tous,

J'ai une petite appli en C qui doit connaitre le nombre de lignes de
deux fichiers avant de faire des calculs. Comment connaitre ce nombre de
lignes?

Merci.

AZ.

10 réponses

1 2 3
Avatar
Zulfukar Arslan
C'est bon, j'ai un truc qui marche:

while( fgets(ligne, 200, fichier) != NULL){
count++;
}


Zulfukar Arslan wrote:
Bonjour a tous,

J'ai une petite appli en C qui doit connaitre le nombre de lignes de
deux fichiers avant de faire des calculs. Comment connaitre ce nombre de
lignes?

Merci.

AZ.


Avatar
Marc Boyer
Le 19-04-2006, Zulfukar Arslan a écrit :
C'est bon, j'ai un truc qui marche:

while( fgets(ligne, 200, fichier) != NULL){
count++;
}


Tant que les lignes font moins de 200 caractères ça marche.
Puis il y a l'éternel problème de la dernière ligne vide...

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. Paul Éluard)

Avatar
Harpo
Zulfukar Arslan wrote:

Bonjour a tous,

J'ai une petite appli en C qui doit connaitre le nombre de lignes de
deux fichiers avant de faire des calculs. Comment connaitre ce nombre
de lignes?


en les donnant en arguments à ton programme
$ myprogram --n1 `wc -l myfile1` --n2 `wc -l myfile2`

les '`' sont des backquotes.

--
http://patrick.davalan.free.fr/

Avatar
Harpo
Zulfukar Arslan wrote:

C'est bon, j'ai un truc qui marche:

while( fgets(ligne, 200, fichier) != NULL){
count++;
}


Marche pas toujours.
On peut aussi lire tous les caractères du fichier et ajouter 1 à count
quand c'est un 'n'.
On initialise count à 0 ou 1 suivant que l'on désire qu'une dernière
ligne non terminée par 'n' soit comptée ou non (si on veut la compter,
un fichier vide aura 1 ligne).
--
http://patrick.davalan.free.fr/

Avatar
Zulfukar Arslan
Merci pour toutes ces astuces. J'avais pensé aussi à les donner en
argument en utilisant "wc -l fichier" mais j'ai un probleme pour lire
ces arguments.
A l'interieur du programme j'ecris:

int nombre_de_lignes;

nombre_de_lignes = argv[3]; // j'ai déja deux autres parametres qui sont
les deux fichiers.


si je fais printf("nombr de lignes %dn", nombre_de_lignes);

il me renvoie "-1073745949". Je pense que la lecture n'est pas bonne.
Comment faire?



Harpo wrote:
Zulfukar Arslan wrote:


Bonjour a tous,

J'ai une petite appli en C qui doit connaitre le nombre de lignes de
deux fichiers avant de faire des calculs. Comment connaitre ce nombre
de lignes?



en les donnant en arguments à ton programme
$ myprogram --n1 `wc -l myfile1` --n2 `wc -l myfile2`

les '`' sont des backquotes.




Avatar
Targeur fou

Hello,

Merci pour toutes ces astuces. J'avais pensé aussi à les donner en
argument en utilisant "wc -l fichier" mais j'ai un probleme pour lire
ces arguments.
A l'interieur du programme j'ecris:

int nombre_de_lignes;

nombre_de_lignes = argv[3]; // j'ai déja deux autres parametres qui s ont
les deux fichiers.


Ben si comptes mettre un char * dans un entier, c'est normal tu
récupères n'importe quoi.
nombre_de_lignes = (int)strtol(argv[3], NULL,10);
+ éventuellement controle du retour et de errno

si je fais printf("nombr de lignes %dn", nombre_de_lignes);

il me renvoie "-1073745949". Je pense que la lecture n'est pas bonne.


Si c'est bien le 3ieme arg du programme, y'a pas de raison. C'était
juste la conversion chaine en nombre qui n'était pas faite. A noter
que de bonnes options de compil t'auraient averties de cette conversion
douteuse char * vers int.

A+
Regis

Avatar
Zulfukar Arslan
Targeur fou wrote:

Hello,


Merci pour toutes ces astuces. J'avais pensé aussi à les donner en
argument en utilisant "wc -l fichier" mais j'ai un probleme pour lire
ces arguments.
A l'interieur du programme j'ecris:

int nombre_de_lignes;

nombre_de_lignes = argv[3]; // j'ai déja deux autres parametres qui sont
les deux fichiers.



Ben si comptes mettre un char * dans un entier, c'est normal tu
récupères n'importe quoi.
nombre_de_lignes = (int)strtol(argv[3], NULL,10);
+ éventuellement controle du retour et de errno



Je viens d'essayer. Ca me renvoie tout le temps 0.


si je fais printf("nombr de lignes %dn", nombre_de_lignes);

il me renvoie "-1073745949". Je pense que la lecture n'est pas bonne.



Si c'est bien le 3ieme arg du programme, y'a pas de raison. C'était
juste la conversion chaine en nombre qui n'était pas faite. A noter
que de bonnes options de compil t'auraient averties de cette conversion
douteuse char * vers int.



-g -Wall

A+
Regis




Avatar
Targeur fou

Re,

Targeur fou wrote:

Hello,


Merci pour toutes ces astuces. J'avais pensé aussi à les donner en
argument en utilisant "wc -l fichier" mais j'ai un probleme pour lire
ces arguments.
A l'interieur du programme j'ecris:

int nombre_de_lignes;

nombre_de_lignes = argv[3]; // j'ai déja deux autres parametres qui sont
les deux fichiers.



Ben si comptes mettre un char * dans un entier, c'est normal tu
récupères n'importe quoi.
nombre_de_lignes = (int)strtol(argv[3], NULL,10);
+ éventuellement controle du retour et de errno



Je viens d'essayer. Ca me renvoie tout le temps 0.


As-tu bien inclus <stdlib.h> histoire que le compilo ne s'amuse pas à
essayer de faire semblant de savoir de quelle fonction il s'agit ?
(strtol()) ?


si je fais printf("nombr de lignes %dn", nombre_de_lignes);

il me renvoie "-1073745949". Je pense que la lecture n'est pas bonne.



Si c'est bien le 3ieme arg du programme, y'a pas de raison. C'était
juste la conversion chaine en nombre qui n'était pas faite. A noter
que de bonnes options de compil t'auraient averties de cette conversion
douteuse char * vers int.



-g -Wall


?? Je ne'ai pas la doc de gcc sous la main, mais ca me parait bizare
qu'avec -Wall il ne soit pas verbeux. Mets aussi -std9 (ou c99, ou
aut' chose) et -W pour voir. Avec le compilo MS CL v12, ce dernier sort
clairement 'int' differs in level of indirection from 'char*'

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

int main(int argc, char **argv)
{

int entier = 0;
char * nonconvertie = NULL;

/* Doit sortir un joli warning (char* -> int) */
/* entier = argv[0]; */

if (argc!=2) {
fprintf(stderr,"Nb args incorrectn"
"Usage : nom_exe <entier>n");
return EXIT_FAILURE;
}

printf("A convertir : %sn", argv[1]);

entier = (int)strtol(argv[1],&nonconvertie,10);

if ( nonconvertie != NULL) {
printf("Partie non convertie : %sn", nonconvertie);
}

if (errno != 0 ){
puts("Nombre trop grand");
}

if ( !(entier == 0 && strcmp(nonconvertie, argv[1]) == 0) ) {
printf("Entier saisi : %dn", entier);
}

return 0;

}



Avatar
Harpo
Zulfukar Arslan wrote:


Ben si comptes mettre un char * dans un entier, c'est normal tu
récupères n'importe quoi.
nombre_de_lignes = (int)strtol(argv[3], NULL,10);
+ éventuellement controle du retour et de errno



Je viens d'essayer. Ca me renvoie tout le temps 0.


T'as du faire une bourde quelque part, le petit programme suivant
marche :
----------
#include <stdio.h>
#include <stdlib.h>
int
main( int argc, char **argv ) {
(void)argc;
printf( "%dn", (int)strtol( argv[1], NULL, 10 ) );
exit( EXIT_SUCCESS );
}
---------
$ gcc -W -Wall -stdÉ9 strtol.c -o strtol
$ ./strtol 421
421

Bingo !




-g -Wall


-g ne devrait pas avoir d'incidence sur les warnings, '-W -Wall' me
semble un bon compromis entre une profusion d'options et aucune.

--
http://patrick.davalan.free.fr/


Avatar
Emmanuel Delahaye
C'est bon, j'ai un truc qui marche:

while( fgets(ligne, 200, fichier) != NULL){
count++;
}


Marche pas. Si une ligne fait plus de 199 caractères, le comptage est
faux. Il suffit de lire avec fgetc() et de compter les 'n'. Attention,
si la dernière ligne n'est pas complète (pas de 'n'), elle n'est pas
comptée.

--
A+

Emmanuel Delahaye

1 2 3