Calcul du nombre de colonnes dans un fichier
godzilla393
Messages postés
16
Statut
Membre
-
fiddy Messages postés 441 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 441 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?
Configuration: Solaris Firefox 2.0.0.14
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
-
j'ai choisis TAILLE_MAX = 200,
#define TAILLE_MAX 200 //utile pour la fonction fgetc, pour s'assurer qu'il y aura pas de dépassement de mémoire
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() ;-)
while (fgets(chaine, TAILLE_MAX, fichier) != NULL) { nl++; } printf("ligne= %i\n",nl); /* Lecture du fichier pour trouver le nombre de colonnes */ rewind(fichier); while ( (nc = getc(fichier) ) != '\n' ) { if ( nc != ' ') nc++; } printf("colonne= %i\n",nc);- j'aurai une autre petite question
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
#define NC (10) #define MC (5)
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
int NC = fonction (...); int MC =fonction2 (...);
et dans fichier.hextern int NC;
est ce que c'est pas trop moche?
-