Pourquoi je n'arrive pas à lire mon fichier ligne par ligne
Résolu
geekat
Messages postés
228
Date d'inscription
Statut
Membre
Dernière intervention
-
geekat Messages postés 228 Date d'inscription Statut Membre Dernière intervention -
geekat Messages postés 228 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Dans mon code, je n'arrive à lire que la 1ère ligne de mon fichier (ce sont des float séparés par des virgules).
Je n'arrive pas à lire le reste du fichier, tout est à zéro.
J'utilise la fonction scanf.
Je pense que le programme ne comprend pas qu'il doit aller vers la ligne suivante.
J'ai essayé while (fichier != EOF), mais j'ai une erreur.
Voici le code :
Dans mon code, je n'arrive à lire que la 1ère ligne de mon fichier (ce sont des float séparés par des virgules).
Je n'arrive pas à lire le reste du fichier, tout est à zéro.
J'utilise la fonction scanf.
Je pense que le programme ne comprend pas qu'il doit aller vers la ligne suivante.
J'ai essayé while (fichier != EOF), mais j'ai une erreur.
Voici le code :
/* Fichiers d'en-tête */ #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h> int main(int argc, char *argv[]) { FILE* fichier = NULL; /* Ouverture fichier */ fichier = fopen("iris_data.txt", "r+"); if (fichier != NULL) { // On peut lire et écrire dans le fichier printf("Le fichier IRIS DATA est ouvert \n"); int i; float vect[150][4] = {0}; //vecteur du fichier 150 lignes et 4 colonnes for (int j=0;j<=149;j++) { fscanf(fichier, "%f ,%f ,%f ,%f", &vect[j][0], &vect[j][1], &vect[j][2], &vect[j][3]); printf("Le vecteur de donnees %d est : %f,%f,%f,%f \n",j, vect[j][0], vect[j][1], vect[j][2], vect[j][3]); } } else { // On affiche un message d'erreur si on veut printf("Impossible d'ouvrir le fichier iris_data.txt"); } return 0; }
A voir également:
- Pourquoi je n'arrive pas à lire mon fichier ligne par ligne
- Lire le coran en français pdf - Télécharger - Histoire & Religion
- Lire fichier epub - Guide
- Partager photos en ligne - Guide
- Fichier bin - Guide
- Aller à la ligne excel - Guide
2 réponses
Bonjour,
Je te conseille plutôt d'utiliser fgets() pour lire la ligne entièrement.
Puis pour récupérer les flottants, utilise sscanf().
Note : je te conseille aussi d'utiliser double plutôt que float.
Je te conseille plutôt d'utiliser fgets() pour lire la ligne entièrement.
Puis pour récupérer les flottants, utilise sscanf().
Note : je te conseille aussi d'utiliser double plutôt que float.
Création fichier
Chez moi, le code:
Output:
johand@bata:~/src/CCM/C$ tail -5 iris_data.txt
5096.7451,1813.11470,17569.30483,9066.15078
5881.30140,11696.11156,16034.14270,22747.16579
30571.16016,10461.1037,3768.7017,11475.8207
30971.828,9449.25670,26610.1357,14729.10280
2713.6559,28056.16958,17896.16688,30959.14626
johand@bata:~/src/CCM/C$ ./float150 | tail -5
Le vecteur de donnees 145 est : 5096.745117,1813.114746,17569.304688,9066.150391
Le vecteur de donnees 146 est : 5881.301270,11696.111328,16034.142578,22747.166016
Le vecteur de donnees 147 est : 30571.160156,10461.103516,3768.701660,11475.820312
Le vecteur de donnees 148 est : 30971.828125,9449.256836,26610.134766,14729.102539
Le vecteur de donnees 149 est : 2713.656006,28056.169922,17896.166016,30959.146484
for j in {1..150} ; do for i in 1 2 3 ; do echo -n ${RANDOM}.${RANDOM} ; echo -n "," ; done ; echo ${RANDOM}.${RANDOM} ; done > iris_data.txt
Chez moi, le code:
/* Fichiers d'en-tête */ #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h> #define N 150 int main(int argc, char *argv[]) { FILE* fichier = NULL; /* Ouverture fichier */ fichier = fopen("iris_data.txt", "r+"); if (fichier != NULL) { // On peut lire et écrire dans le fichier printf("Le fichier IRIS DATA est ouvert \n"); float vect[N][4] = {0}; //vecteur du fichier 150 lignes et 4 colonnes for (int j=0; j < N; j++) { printf("j=%d\n", j); fscanf(fichier, "%f,%f,%f,%f", &vect[j][0], &vect[j][1], &vect[j][2], &vect[j][3]); printf("Le vecteur de donnees %d est : %f,%f,%f,%f \n",j, vect[j][0], vect[j][1], vect[j][2], vect[j][3]); } fclose(fichier); } else { // On affiche un message d'erreur si on veut printf("Impossible d'ouvrir le fichier iris_data.txt"); } return 0; }
Output:
johand@bata:~/src/CCM/C$ tail -5 iris_data.txt
5096.7451,1813.11470,17569.30483,9066.15078
5881.30140,11696.11156,16034.14270,22747.16579
30571.16016,10461.1037,3768.7017,11475.8207
30971.828,9449.25670,26610.1357,14729.10280
2713.6559,28056.16958,17896.16688,30959.14626
johand@bata:~/src/CCM/C$ ./float150 | tail -5
Le vecteur de donnees 145 est : 5096.745117,1813.114746,17569.304688,9066.150391
Le vecteur de donnees 146 est : 5881.301270,11696.111328,16034.142578,22747.166016
Le vecteur de donnees 147 est : 30571.160156,10461.103516,3768.701660,11475.820312
Le vecteur de donnees 148 est : 30971.828125,9449.256836,26610.134766,14729.102539
Le vecteur de donnees 149 est : 2713.656006,28056.169922,17896.166016,30959.146484
Plusieurs erreurs.
Ta variable c est un char. "\n" n'est pas un caractère mais une chaîne. D'où le warning.
Il faut donc plutôt mettre '\n' (apostrophes). De plus, lorsque tu fais char c; tu déclares une variable sans l'initialiser et tu l'utilises... Comportement aléatoire.
Sinon, je n'arrive pas à faire le lien entre ma demande et ton code ?
Ce que je dis est de mettre un getchar() dans ta boucle.
Teste plutôt :
<code c>
for (...) {
...
getchar();
}
Ta variable c est un char. "\n" n'est pas un caractère mais une chaîne. D'où le warning.
Il faut donc plutôt mettre '\n' (apostrophes). De plus, lorsque tu fais char c; tu déclares une variable sans l'initialiser et tu l'utilises... Comportement aléatoire.
Sinon, je n'arrive pas à faire le lien entre ma demande et ton code ?
Ce que je dis est de mettre un getchar() dans ta boucle.
Teste plutôt :
<code c>
for (...) {
...
getchar();
}
Je vais essayer fgets.
En utilisant double, le résultat n'apparaît pas (0.00000), par contre avec float ça marche.
Si ça marche pas avec double, tu l'as probablement mal utilisé.
Au hasard, je dirais que tu as oublié de mettre "%lf" (L minuscule) dans le scanf().
Maintenant ça marche merci bcp :)
Je lis bien ligne par ligne, puis j'extrais bien les float.
Maintenant, j'aimerais faire des opérations mathématiques avec ces floats de chaque ligne.
Le souci c'est que ça s'affiche mal, beaucoup lignes ne sont pas calculées.
J'ai un autre souci, les 19 premières lignes ne sont pas lues, c'est un peu bizarre, toutes les suivantes sont affichées, et toutes les lignes ont la même syntaxe.
printf("Chaine: %s, nombre1: %lf
Ce n'est pas %lf (L minuscule) qu'on met dans les printf() mais "%f".
float vect[4] = {nombre1,nombre2,nombre3,nombre4};
nombre1,... sont des double alors que vect[...] est un float.