[C] pb avec fscanf et une structure en para

Résolu/Fermé
pierro540 Messages postés 82 Date d'inscription samedi 5 août 2006 Statut Membre Dernière intervention 10 mai 2011 - 14 déc. 2009 à 23:22
 lami20j - 15 déc. 2009 à 03:48
Bonjour,
voila j'ai un probleme que j'arrive pas a résoudre, je veux enregistrer les valeurs contenus dans un fichier texte, dans une variable de type pointeur d'une structure, houlala je suis pas clair du tout ^^

voila mon code vous comprendrez mieux :

Main :

#include <stdio.h>
#include "fonction.h"

int main(){
    	char *nf="tableau.txt";
	    TabS t;
    	
    	fonction(&t,nf);
    	
    	return 0;
}


fonction.h

typedef struct{
        int tail;
        int *tab;
} TabS;

void fonction(TabS *t , char *nf){ 
	int i=0;
	int a;
	FILE * fp;
	
	fp = fopen(nf,"r");
	
	while( !feof(fp)){
           fscanf(fp , "%d" , &a);
           i++;
           }
	
    t->tail = i;
	
	t->tab = malloc(t->tail * sizeof(int));
	
	while( !feof(fp)){
            fscanf(fp,"%i", (t->tab)+i);  /* l'erreur vient d'ici, il n'enregistre pas mes valeurs et je ne sais pas    pourquoi, j'ai deja utiliser cette methode pour un scanf 'simple' et cela marche, mais avec le fscanf, ca marche plus :s */
            printf("%d ",*((t->tab)+i));
            i++;
            }
	
	fclose(fp) ;
}


voila, si quelqu'un peu m'aider ce serait vraiment cool

bye !

6 réponses

Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
14 déc. 2009 à 23:55
bon mon erreur ça doit être que je n'ai pas ce fichier :P

L'utilisation de scanf et fscanf est en fait assez compliquée, ce n'est pas étonnant que cela cause des bugs.

par contre je viens de remarquer quelque chose ...

la variable i n'est pas remise à zéro pour la deuxième boucle ;)

donc débordement très probables. ---> plantage et/ou données aléatoires et erronées
2
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
14 déc. 2009 à 23:41
l'erreur ne vient pas du fait que le fichier est déjà lu dans la boucle juste avant, et donc que la fin du fichier est déjà atteinte ? aucun printf ne s'affiche dans cette deuxième boucle?

PS : perso j'ai un problème bien plus grave : lorsque j'exécute ton programme il plante après quelques secondes et s'arrête tout seul avec le message "Test.exe a rencontré un problème et doit fermer..." de Windows.
0
pierro540 Messages postés 82 Date d'inscription samedi 5 août 2006 Statut Membre Dernière intervention 10 mai 2011 18
14 déc. 2009 à 23:47
Re, merci d'avoir repondu aussi vite !

je n'ai pas ton probleme d'erreur windows chez moi, par contre j'ai essayer de fermer le fichier et de le rouvrir pour le parcourir une deuxieme fois, et la j'ai l'erreur de windows, c'est un peu bizarre.

autrement il m'affiche bien quelque chose mais les valeurs ne sont pas celles de mon fichier texte

bye
0
pierro540 Messages postés 82 Date d'inscription samedi 5 août 2006 Statut Membre Dernière intervention 10 mai 2011 18
14 déc. 2009 à 23:54
oups, en fait je t'envoie tout au complet :

main

#include <stdio.h>
#include "fonction.h"

int main(){
    	char *nf="tableau.txt";
	    TabS t;
    	
    	fonction(&t,nf);
    	affichageTS(t);
    	
    	return 0;
}


fonction.h
#include <stdio.h>

typedef struct{
        int tail;
        int *tab;
} TabS;

void fonction(TabS *t , char *nf){
	int i=0;
	int a;
	FILE * fp;
	
	fp = fopen(nf,"r");
	
	while( !feof(fp)){
           fscanf(fp , "%d" , &a);
           i++;
           }
	
    t->tail = i;
	fclose(fp);
	
	fp=fopen(nf,"r");
	t->tab = malloc(t->tail * sizeof(int));
	
	while( !feof(fp)){
            fscanf(fp,"%i", (t->tab)+i);
            printf("%d ",*((t->tab)+i));
            i++;
            }
	
	fclose(fp) ;
}

void affichage(TabS t){
     	int i;
     	
     	printf("merci\naffichage\ntaille : %d\n", t.tail);
     	
     	for(i=0 ; i<t.tail ; i++) printf("%d %d\n", (t.tab+i), *(t.tab+i));
	
	printf("affichage termine\n");
     	
}



avec fclose(fp); suivi de fopen j'ai bien mes valeurs qui s'affiche grace a la fonction 'fonction' mais les valeurs affichées par 'affichage' elles ne sont pas bonnes, et de plus j'ai l'erreur windows.
0

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

Posez votre question
pierro540 Messages postés 82 Date d'inscription samedi 5 août 2006 Statut Membre Dernière intervention 10 mai 2011 18
15 déc. 2009 à 00:02
YEAHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

merci !!! ca marche nickel maintenant !!!

l'erreur d'affichage vient du i qui n'etait pas réinitialisé, je ne l'avais pas vu :s

par contre, je ne comprend pas trop pourquoi j'ai du fermer et rouvrir le fichier pour que cela fonctionne, tu peux m'expliquer stp ?

et encore merci !
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
15 déc. 2009 à 01:22
et bien je pense que c'est justement pour remettre le "curseur" de lecture au début du fichier.

Cordialement et content de t'avoir aidé
0
Salut,

je ne comprend pas trop pourquoi j'ai du fermer et rouvrir le fichier pour que cela fonctionne, tu peux m'expliquer stp ?


Tu n'était pas obligé de le faire. A voir la fonction fseek.

Voici une exemple
lami20j@debian:~$ cat number.txt
10
20
30
40
lami20j@debian:~$ cat number.c
#include<stdio.h>
#include<stdlib.h>

int main()
{
  FILE * fp;
  int i,j,c;
  int *tab;
  i=j=0;

  if(NULL==(fp = fopen("number.txt","r")))
    return EXIT_FAILURE;

  while((c=fgetc(fp))!=EOF)
    if(c=='\n')++i; /* le nombre de ligne */

  fseek(fp,0,SEEK_SET); /* je suis au début du fichier */

  tab=malloc(i*sizeof(int));

  while(j<i && !feof(fp)){
    fscanf(fp,"%d",tab+j);
    printf("%d ",*(tab+j));
    ++j;
  }
  printf("\n");
  fclose(fp);
  free(tab);
  return EXIT_SUCCESS;
}

lami20j@debian:~$ gcc -Wall number.c
lami20j@debian:~$ ./a.out
10 20 30 40
lami20j@debian:~$
0