Fonction LECTURE+STOCKAGE en C

Résolu/Fermé
julie - 1 juin 2009 à 21:23
mamiemando Messages postés 33320 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 octobre 2024 - 2 juin 2009 à 19:43
Bonjour,

LE BUT: est de lire un ficher et de stocker les donner dans 2vecteurs(tableau c pareil )

EXO2.TXT :
-2;-6
-1.25;-10.828125
-0.5;-13.125
0.25;-10.359375
1;0
1.75;20.484375
2.5;53.625


voici ma fonction

void lecture(vect t,vect y,int *n)
{
vect a,b;
FILE *F=NULL;
F=fopen("exo2.text","r");

/* on calcule le nombre de ligne*/
while(!feof(F)){
n++;
fscanf(F,"%f %f",&a,&b);
}
fclose(F);

printf("%d",n);

/* on remplit le vecteur t et y des données de l'exercice2*/
for(i=0;i<=n;i++){

fprintf(F,"%f %f",t[i],y[i]);
}

}


LE PROBLEME : quand je compile windows me dit que qu'il y aeu une erreur avec le fichier, mias à la base ca compile bien
MA QUESTION : est ce que ma fonction est bonne malgrès le probléme avec windows ?
A voir également:

7 réponses

en fait le probléme au niveau microsoft c'est a cause de feof(F) car si je fias un test avec un printf avant feof'F),il affiche ce que je met mais si je fais un printf après il marque rien
0
AmineKalaa Messages postés 87 Date d'inscription jeudi 26 mars 2009 Statut Membre Dernière intervention 10 janvier 2011 7
1 juin 2009 à 23:55
verifiez l'extention de votre fichier".text??? c'est plutôt" .txt"
0
mamiemando Messages postés 33320 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 octobre 2024 7 798
1 juin 2009 à 23:36
Il y a plusieurs choses qui ne vont pas :

1) le FILE * : en C on note en général juste les #define en capitale ou les constantes. Ici il serait plus logique de le nommer par exemple fp. De plus il faut contrôler que le fichier c'est ouvert avec succès, c'est-à-dire que fp est non nul. Sinon il faut quitter le programme (sans faire le fclose(fp)).
FILE *fp = fopen("exo2.txt","r");
if (!fp){
  fprintf(stderr,"can't open exo2.txt");
  return;
}
...
flcose(fp);

2) le fscanf :
fscanf(F,"%f %f",&a,&b); 

Vu le format de ton fichier ce serait plutôt "%f ; %f". De plus vu que &a et &b ne changent pas à chaque itérations, chaque valeur lue est inscrite dans la même zone mémoire. En supposant que vect soit un float *, cale signifie que tu écris toujours dans a[0] et b[0].

Ton fscanf devrait donc plutôt écrire dans &t[*n] et &y[*n] en supposant que n ait été initialisé à 0 lors de l'appel de ta fonction (il serait plus prudent alors de le réinitialiser à 0 et incrémenter ensuite). De plus il est important de contrôler que ton fscanf a correctement lu deux float (il doit donc retourner 2) sinon tu vas insérer des valeurs en carton dans ton vecteur pour les lignes qui ne correspondent pas. C'est donc uniquement dans ce cas que t[*n] et y[*n] doivent être corrigés et n incrémenté.
float a,b;
...
*n = 0;
while(!feof(F)){
  if(fscanf("%f ; %f",&x,&y) == 2){
    t[n] = a;
    y[n] = b;
    ++*n
  }
}


3) Dans ton programme tu as oublié le fclose alors qu'il est indispensable, car c'est lui qui garantit que le fichier est correctement écrit. Il ne faut fermer un FILE * que si celui-ci a été ouvert avec succès.

4) Je te rappelle qu'en C tu ne peux pas copier un tableau dans un tableau juste avec un =, il faut écrire une boucle (que ce soit un int * ou un char * ou n'importe quel type de tableau). De toute façon on ne devrait jamais parler de tableau en C car ça fausse la compréhension. L'écriture int a[10] n'est qu'un raccourci qui dit au compilateur de réserver un espace de 10 entiers et d'enregistrer l'adresse de ce bloque dans a (qui doit donc être vu comme un int *). Le fait d'écrire ensuite a[i] doit toujours être considéré comme le résultat de l'opération *(a+i), c'est à dire l'entier qui se trouve i entiers derrière l'adresse a. En particulier *a = a[0].

Si tu as bien compris ça, tu dois garder à l'esprit que quand tu écris :
int a[10];
int b[10]
b = a

À aucun moment le contenu du bloc mémoire à l'adresse a n'est recopié dans le bloc mémoire pointé par b. Tu dis simplement : enregistrer dans la variable b l'adresse de a. Ainsi, si par la suite tu manipule a[i] tu modifieras b[i] (et réciproquement). Si tu veux vraiment faire une recopie, il faut donc écrire une boucle for :
for(i=0;i<10;++i) a[i] = b[i];

Bonne chance
0
merci pour les réponse mais :

- a et b je " m'ne foutais " un peu car c'étais juste pour calculer la taille avec n ;

et sinon j'ai fais une autre fonction beaucoup plus simple qui permet de stocker les données du fichier test.txt que voici :
2
6
5
2


et la FONCTION :

#include <stdio.h>
#include <stdlib.h>
typedef int vect[100];
int main (void)
{
int i,n;
vect t,y;
FILE *f=NULL;
f=fopen("test.txt","r");


for(i=0;i<3;i++){

fscanf(f,"%d",&t[i]);
}

fclose(f);
for(i=0;i<3;i++){

printf("%d",t[i]);
}

getch();
return 0;
}



J'ai tout mis en entier ,et j'ai pas calculé n pour éviter le while(!feof), je m'arrete à 3 et il m'affiche du truc du genre
1011
131
9
qui a aucun rapport;

je vois pas du tout ce qui va pas je compile avec Dev-C++

Quelqun a déja lu ou éccris sur un fichier avec ce compilateur ?

merci d'avance
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
2 juin 2009 à 10:46
Salut,

Merci de ne plus poster le même problème plusieurs fois
http://www.commentcamarche.net/forum/affich 12686911 fonction void ecrire en c?#2
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
^^ mon autre sujet c'étais écrire, là c'est lire un fichier et stocker les données


en tout cas merci pour la réponse sur l'autre sujet, ca confirme ce que je pensais même si chez moi ça marche pas

je crois qu'on peut mettre résolu sur ce sujet car ce que je cherchais avant tout c'étais à savoir si la synthaxe était bonne

merci mami et l'ami :p
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
2 juin 2009 à 12:54
Re,

mon autre sujet c'étais écrire, là c'est lire un fichier et stocker les données
Tu as raison. Mea culpa ;-)
0
mamiemando Messages postés 33320 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 octobre 2024 7 798
2 juin 2009 à 19:43
Franchement ça m'épuise de te dire tout ce qui n'allait pas dans ton programme de départ et de voir que tu n'as retenu ou pris le temps de lire que la moitié de ce que je t'avais expliqué. Après faut pas être surpris si ça déconne.
#include <stdio.h>
#include <stdlib.h>

typedef int vect[100];

int main(){
    unsigned i;
    vect t;
    int x;
    FILE *f;

    f=fopen("test.txt","r");
    if(!f){
        fprintf(stderr,"can't open test.txt\n");
        return 1;
    }
    for(i=0;i<4;i++){
        if(fscanf(f,"%d",&x) == 1) t[i] = x;
    }
    fclose(f);

    for(i=0;i<4;i++) printf("%d\n",t[i]);

    getchar();
    return 0;
}

Et accessoirement, quand tu compte de i=0 à <3, ça fait i=0,1,2 donc ça ne lit pas la dernière ligne. De plus quand ton compilateur te met des warning (variables inutilisées et autres...) a priori ce n'est pas sans raison.

Bonne chance
0