Calcul du nombre de colonnes dans un fichier
godzilla393
Messages postés
16
Date d'inscription
Statut
Membre
Dernière intervention
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
je souhaite déterminer le nombre de colonnes que j'ai dans un fichier qui peut ressembler à ça :
0 0 0 0
0 1 1 0
0 1 1 0
0 0 0 0
cmt faire?
j'ai déterminé le nombre de lignes en utilisant la fonction gets ()
pour le nombre de colonnes, j'avais pensé à la fonciton getc() mais je boucle indéfiniment.
est ce que vous pouvez m'aider?
je souhaite déterminer le nombre de colonnes que j'ai dans un fichier qui peut ressembler à ça :
0 0 0 0
0 1 1 0
0 1 1 0
0 0 0 0
cmt faire?
j'ai déterminé le nombre de lignes en utilisant la fonction gets ()
pour le nombre de colonnes, j'avais pensé à la fonciton getc() mais je boucle indéfiniment.
/* Lecture du fichier pour trouver le nombre de lignes*/ while (fgets(chaine, TAILLE_MAX, fichier) != NULL) { /* fgets() lit une chaîne de caractères jusqu'à le retour à la ligne */ ligne++; /* on compte le nombre de retour à la ligne */ } printf("ligne= %i",ligne); nl=ligne; /* Lecture du fichier pour trouver le nombre de colonnes */ rewind(fichier); while ( (c = getc(fichier) ) != atoi ("\n") ) { if ( c != atoi(" ")) colonne++; } nc = colonne;
est ce que vous pouvez m'aider?
A voir également:
- Calcul du nombre de colonnes dans un fichier
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
- Fichier .dat - Guide
1 réponse
Salut,
* fgets() lit une chaîne de caractères jusqu'à le retour à la ligne */
Pas exactement. Il copie au maximum TAILLE_MAX. Important de le préciser car si la ligne est trop grande, tu n'auras pas tout dans ton buffer. Ce qui peut donc fausser ton calcul.
atoi ("\n")
Cela va te renvoyer 0 puisque \n n'est pas un chiffre. Si tu veux le code ascii correspondant à '\n', utilise simplement '\n'.
Ce qui donnerait :
while ( (c = getc(fichier) ) != '\n') {
De même pour l'espace. Utilise : <gras>' '</gras>
Note qu'il s'agit de l'apostrophe simple et non du guillemets.
Sinon, une simple boucle while suffisait en utilisant fgetc.
Dans une boucle while jusqu'à la fin du fichier, si le caractère lu est un espace t'augmentes ta variable nc initialisée à 1, si le caractère est un '\n', alors t'incrémentes ta variable nl initialisée à 0. Tu n'as pas besoin de passer par des variables (colonne et ligne) intermédiaires.
De plus, faut être sûr que le fichier ne contient pas bien qu'un seul espace entre chaque nombre. Sinon il faudra adapter l'algorithme.
Cdlt
* fgets() lit une chaîne de caractères jusqu'à le retour à la ligne */
Pas exactement. Il copie au maximum TAILLE_MAX. Important de le préciser car si la ligne est trop grande, tu n'auras pas tout dans ton buffer. Ce qui peut donc fausser ton calcul.
atoi ("\n")
Cela va te renvoyer 0 puisque \n n'est pas un chiffre. Si tu veux le code ascii correspondant à '\n', utilise simplement '\n'.
Ce qui donnerait :
while ( (c = getc(fichier) ) != '\n') {
De même pour l'espace. Utilise : <gras>' '</gras>
Note qu'il s'agit de l'apostrophe simple et non du guillemets.
Sinon, une simple boucle while suffisait en utilisant fgetc.
Dans une boucle while jusqu'à la fin du fichier, si le caractère lu est un espace t'augmentes ta variable nc initialisée à 1, si le caractère est un '\n', alors t'incrémentes ta variable nl initialisée à 0. Tu n'as pas besoin de passer par des variables (colonne et ligne) intermédiaires.
De plus, faut être sûr que le fichier ne contient pas bien qu'un seul espace entre chaque nombre. Sinon il faudra adapter l'algorithme.
Cdlt
merci pour tes remarques très judicieuses et ta correction, ca fonctionne
par contre je garde mes 2 boucles, pour montrer à mes profs que je sais utiliser getc() et scanf() ;-)
au début j'ai considéré que le nb de colonnes et de lignes étaient des constantes. J'ai donc utilisé des
#define dans un fichier .h parce que j'utilise ces valeurs dans plusieurs fichiers .c
maintenant ces valeurs (nc, nl) sont le résultat d'une fonction.
est ce que j'ai un moyen plus astucieux que de remplacer ces #define par des variables externes?
je pensais écrire dans fichier.c
et dans fichier.h
est ce que c'est pas trop moche?
Si tu n'as que fichier.c et fichier.h, pas besoin d'utiliser de variables globales.
Tu définis simplement tes variables à l'intérieur de fichier.c, et tu les envoies en paramètres aux fonctions qui en ont besoin.
cmt faire?
Dans un fichier source, tu déclares tes variables nc et nl normalement. Dans les autres, tu utilises le mot-clé extern.
Cdlt