Calcul du nombre de colonnes dans un fichier

Fermé
godzilla393 Messages postés 16 Date d'inscription mardi 5 mai 2009 Statut Membre Dernière intervention 9 mai 2009 - 9 mai 2009 à 20:28
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 9 mai 2009 à 22:16
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.
/* 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:

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
9 mai 2009 à 20:49
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
1
godzilla393 Messages postés 16 Date d'inscription mardi 5 mai 2009 Statut Membre Dernière intervention 9 mai 2009 1
9 mai 2009 à 21:11
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);
0
godzilla393 Messages postés 16 Date d'inscription mardi 5 mai 2009 Statut Membre Dernière intervention 9 mai 2009 1 > godzilla393 Messages postés 16 Date d'inscription mardi 5 mai 2009 Statut Membre Dernière intervention 9 mai 2009
9 mai 2009 à 21:24
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.h
extern int NC;

est ce que c'est pas trop moche?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844 > godzilla393 Messages postés 16 Date d'inscription mardi 5 mai 2009 Statut Membre Dernière intervention 9 mai 2009
9 mai 2009 à 21:42
Cela dépend si tu as plusieurs fichiers sources ou pas.
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.
0
godzilla393 Messages postés 16 Date d'inscription mardi 5 mai 2009 Statut Membre Dernière intervention 9 mai 2009 1 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
9 mai 2009 à 21:56
j'ai plusieurs fichiers sources
cmt faire?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844 > godzilla393 Messages postés 16 Date d'inscription mardi 5 mai 2009 Statut Membre Dernière intervention 9 mai 2009
9 mai 2009 à 22:16
Dans ce cas, tu peux utiliser une variable globale comme tu l'as proposée.
Dans un fichier source, tu déclares tes variables nc et nl normalement. Dans les autres, tu utilises le mot-clé extern.
Cdlt
0