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
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
A voir également:
- Calcul du nombre de colonnes dans un fichier
- Fichier rar - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Ouvrir un fichier .bin - Guide
- Impossible de supprimer un fichier - Guide
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
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
* 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
9 mai 2009 à 21:11
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() ;-)
9 mai 2009 à 21:24
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?
9 mai 2009 à 21:42
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.
9 mai 2009 à 21:56
cmt faire?
9 mai 2009 à 22:16
Dans un fichier source, tu déclares tes variables nc et nl normalement. Dans les autres, tu utilises le mot-clé extern.
Cdlt