Pourquoi je n'arrive pas à lire mon fichier ligne par ligne
Résolu/Fermé
geekat
Messages postés
228
Date d'inscription
vendredi 31 juillet 2015
Statut
Membre
Dernière intervention
24 février 2017
-
25 déc. 2015 à 19:50
geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017 - 26 déc. 2015 à 20:09
geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017 - 26 déc. 2015 à 20:09
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
- Aller à la ligne excel - Guide
- Partager photos en ligne - Guide
- Site de vente en ligne particulier - Guide
2 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
25 déc. 2015 à 20:34
25 déc. 2015 à 20:34
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.
jisisv
Messages postés
3645
Date d'inscription
dimanche 18 mars 2001
Statut
Modérateur
Dernière intervention
15 janvier 2017
934
26 déc. 2015 à 18:21
26 déc. 2015 à 18:21
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
geekat
Messages postés
228
Date d'inscription
vendredi 31 juillet 2015
Statut
Membre
Dernière intervention
24 février 2017
26 déc. 2015 à 19:03
26 déc. 2015 à 19:03
Merci pour ta réponse.
En exécutant ton code, j'ai des résultats commençant par j=2. Toujours un problème de buffer pour j=0 et j=1, je n'ai pas d'affichage.
En exécutant ton code, j'ai des résultats commençant par j=2. Toujours un problème de buffer pour j=0 et j=1, je n'ai pas d'affichage.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
26 déc. 2015 à 19:37
26 déc. 2015 à 19:37
Tu as suivi mes conseils en mettant un getchar() dans le while() ?
geekat
Messages postés
228
Date d'inscription
vendredi 31 juillet 2015
Statut
Membre
Dernière intervention
24 février 2017
Modifié par geekat le 26/12/2015 à 19:47
Modifié par geekat le 26/12/2015 à 19:47
Oui. J'ai essayé :
J'ai toujours un problème de buffer et un warning comparaison between pointer and integer.
char c=getchar() ; while(fgets(chaine, TAILLE_MAX, fichier)!= NULL && c !="\n")
J'ai toujours un problème de buffer et un warning comparaison between pointer and integer.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
>
geekat
Messages postés
228
Date d'inscription
vendredi 31 juillet 2015
Statut
Membre
Dernière intervention
24 février 2017
26 déc. 2015 à 19:49
26 déc. 2015 à 19:49
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();
}
geekat
Messages postés
228
Date d'inscription
vendredi 31 juillet 2015
Statut
Membre
Dernière intervention
24 février 2017
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
26 déc. 2015 à 20:04
26 déc. 2015 à 20:04
Ah oui d'accord.
J'ai retesté. ça marche :)
Chaque fois que je clique sur une touche, j'ai la ligne suivante
Lorsque j'écris 2 caractères, j'ai 2 lignes qui s'affichent ...etc
J'ai retesté. ça marche :)
Chaque fois que je clique sur une touche, j'ai la ligne suivante
Lorsque j'écris 2 caractères, j'ai 2 lignes qui s'affichent ...etc
25 déc. 2015 à 20:41
Je vais essayer fgets.
En utilisant double, le résultat n'apparaît pas (0.00000), par contre avec float ça marche.
25 déc. 2015 à 20:52
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().
25 déc. 2015 à 21:00
Maintenant ça marche merci bcp :)
Modifié par geekat le 26/12/2015 à 00:28
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.
26 déc. 2015 à 01:07
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.