FORUM Syndrome-OC - Jacky-PC


  Programmation


  Langage haut niveau(C, Pascal...)


  Need help en C [ Matrice à partir d'un fichier ]

 




Software et OS Alternatif : Ik12, 1 utilisateur anonyme et 9 utilisateurs inconnus

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Need help en C [ Matrice à partir d'un fichier ]

n°2281
Fafounet
Posté le 21-03-2004 à 21:03:57  profilanswer
 

Salut !  
J'essaie de charger une matrice à partir d'un fichier. Voila ma structure de ma matrice :
 
typedef struct Matrice {
  int nb_col, nb_lig;
  int **coeff;
} Matrice;  
 
Et ma fonction qui déconne :  
 
int remplitDuFichier(Matrice* m, char* fichier)
{
  FILE *f_in;
  int i,j,c;
  i = j = 0;
  if ((f_in = fopen(fichier, "r" )) == NULL){
      fprintf(stderr, "Erreur: Impossible de lire le fichier %s\n", fichier);
      return(EXIT_FAILURE);
  }
  for ( i = 0; i < m->nb_col; i++)
    for ( j = 0; j < m->nb_lig; j++){
      m->coeff[i][j] = fgetc(f_in);
    }
  printf("Chargement reussi de la matrice\n" );
}
 
Quand dans mon fichier j'ai des 0 et des 1 j'ai ca dans ma matrice apres
49 48 48
10 48 49
49 10 48
49 49 49
 
Qqun pourrait-il m'aider ??
 
Sinon deuxiemement, comme vous pouvez le voir c'est un peu con comme méthode parce qu'il faut dejà connaitre la taille de la matrice. J'avais essayé de faire un while ( fgetc(f_in) != "'\n" ) mais ca me met un warning lors de la compil et apres evidemment ca marche pas.
 
Voila :)

mood
Google
Posté le 21-03-2004 à 21:03:57  profilanswer
 

n°2282
Fafounet
Posté le 21-03-2004 à 21:08:33  profilanswer
 

Je precise que les données sont sous cette forme dans le fichiet test.txt :
01100100
00110010
11010010

n°2283
Deadog
Dain Bramaged
Posté le 21-03-2004 à 21:16:35  profilanswer
 

tu as écris le fichier avec des charactère ansi
tes 0 et tes 1 ne correespond pas binairement à des 0 et des 1
utilises la fonction "atoi"


Message édité par Deadog le 21-03-2004 à 21:16:59
n°2287
Fafounet
Posté le 21-03-2004 à 21:40:28  profilanswer
 

printf("%d\n", atoi(fgetc(f_in) ); me dit Atention : passage de l'argument n°1 de « atoi » transforme un entier en pointeur sans transtypage

n°2289
CryoGen
Powered by kitkat©
Posté le 21-03-2004 à 22:22:27  profilanswer
 

rajoute un '&' avant fgetc dans le atoi
 
Il manque aussi une parenthese fermente ;) celle du printf


Message édité par CryoGen le 21-03-2004 à 22:23:26

---------------
I am the bone of my sword...
n°2296
Fafounet
Posté le 22-03-2004 à 12:12:28  profilanswer
 

printf("%d\n", atoi(&fgetc(f_in) ));  
-> error: invalid lvalue in unary `&'

n°2297
Deadog
Dain Bramaged
Posté le 22-03-2004 à 12:50:41  profilanswer
 

non non, pas comme ça, faut changer un minimum qql trucs
atoi prend en paramètre un char*, or ton fgetc renvoie qu'un char
inutile de dire ke recaster le bestiaux en faisant "(char *) fgetc(..." ne sert à rien, ça plantera
 
il faut utiliser fgets, mais fgets à besoin d'un buffer, donc on va faire comme ça :
 

Code :
  1. char *buffer=NULL;
  2. int ton_nombre;
  3. if((buffer = (char *) calloc(2, sizeof(char))) == NULL) return (EXIT_FAILURE);
  4. ....
  5. ton_nombre = atoi(fgets(buffer, 2, f_in));


 
;)

n°2298
Fafounet
Posté le 22-03-2004 à 12:57:13  profilanswer
 

OK merci :)
Je vous préviens j'ai un projet à rendre ds qq jours et je sens que je vais poser des questions toutes les demi heures :')

n°2299
Fafounet
Posté le 22-03-2004 à 13:02:16  profilanswer
 

Mon code est donc :
 
int remplitDuFichier(Matrice* m, char* fichier) /* On remplit la matrice m avec le contenu du fichier */
{
  FILE *f_in;
  int i,j,c;
  char *buffer = NULL;
  i = j = 0;
  if ((f_in = fopen(fichier, "r" )) == NULL){
      fprintf(stderr, "Erreur: Impossible de lire le fichier %s\n", fichier);
      return(EXIT_FAILURE);
  }
  for ( i = 0; i < m->nb_col; i++){
    for ( j = 0; j < m->nb_lig; j++){
      if((buffer = (char *) calloc(2, sizeof(char))) == NULL) return (EXIT_FAILURE);  
      printf("%d ", atoi(fgets(buffer, 2, f_in) ));
      //m->coeff[i][j] = atoi(fgets(buffer, 2, f_in));
    }
    printf("\n" );
  }
  printf("Chargement reussi de la matrice\n" );
}
 
J'ai ceci comme resulat :  
fafounet@gentooFab prog $ ./projet.bin
1 0 0 1 1 0 1
0 0 1 0 0 1 1
1 0 0 0 1 1 1
 
Or :
fafounet@gentooFab prog $ cat test.txt
1001101
0100111
0011110
 
La première ligne est ok mais apres ca merde.  
 
Et sinon on fait comment pour tester la fin de la ligne ?

n°2300
Deadog
Dain Bramaged
Posté le 22-03-2004 à 13:03:25  profilanswer
 

précision :
1-le calloc tu le met pas dans ta boucle :D
pas la peine de l'initialiser des milliard de fois, une fois ça suffit ;)
2-oublie pas de libérer l'espace prit par buffer ("free(buffer)" ) avant la fin de ta fonction
ou alors utilise alloca (comme ça dans ton cas : "buffer = (char *) alloca(2 * sizeof(char))"

n°2301
Deadog
Dain Bramaged
Posté le 22-03-2004 à 13:06:09  profilanswer
 

Fafounet a écrit :


 
La première ligne est ok mais apres ca merde.  
 
Et sinon on fait comment pour tester la fin de la ligne ?


 
 
ah oui, j'pensais plus à ça :
il faut détecter la fin de ta ligne, ou alors l'intégrer mathématiquement dans ta boucle :
 

Code :
  1. for ( i = 0; i < m->nb_col; i++){
  2.    for ( j = 0; j < m->nb_lig; j++){
  3.      printf("%d ", atoi(fgets(buffer, 2, f_in) ));
  4.      //m->coeff[i][j] = atoi(fgets(buffer, 2, f_in));
  5.    }
  6.    printf("\n" );
  7.    fgets(buffer, 2, f_in);
  8. }


 
je pense que la ça devrait aller ;)

n°2302
Deadog
Dain Bramaged
Posté le 22-03-2004 à 13:08:23  profilanswer
 

ou alors
 

Code :
  1. for ( i = 0; i < m->nb_col; i++){
  2.    for ( j = 0; j < m->nb_lig; j++){
  3.      printf("%d ", atoi(fgets(buffer, 2, f_in) ));
  4.      //m->coeff[i][j] = atoi(fgets(buffer, 2, f_in));
  5.    }
  6.    printf("\n" );
  7.    fseek(f_in, 1, SEEK_CUR);
  8. }

n°2303
Fafounet
Posté le 22-03-2004 à 13:13:08  profilanswer
 

et si je veux détecter la fin de la ligne ( j'aimerai ne passer que  un fichier texte en argument et que ca me retourne une matrice.

n°2304
Deadog
Dain Bramaged
Posté le 22-03-2004 à 13:16:14  profilanswer
 

ça risque d'être plus chiant et surtout inutile vu qu'en procédent comme j'ai fait c plus logique et mathématique
(en fait je fait simplement avancé le pointeur dans le fichier de 1 à chaque fin de ligne de ta matrice (qui doit normallement correspondre à une fin de ligne dans ton fichier).
attention, si jamais tu porte ce code la sous windows il faut faire fgets(..., 3, ... ou fseek(..., 2 ...   )

n°2305
Fafounet
Posté le 22-03-2004 à 13:18:38  profilanswer
 

Oue mais bon en chargeant un fichier tu sais pas à priori quel va être le nombre de lignes

n°2307
nicodache
marmotte en chocolat concept ©
Posté le 22-03-2004 à 13:44:29  profilanswer
 

bein ca te renvoie EOF une fin de fichier nan ? (enfin, -1 quoi :d)


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°2308
Fafounet
Posté le 22-03-2004 à 14:04:21  profilanswer
 

Ah par contre la j'ai un truc bien con
Program received signal SIGSEGV, Segmentation fault.
0x40099836 in _IO_adjust_column () from /lib/libc.so.6
 
Tout s'éxécute dans mon main sauf ca ! ( ca ne vient pas de ma fct écrite ci dessus )

n°2309
Fafounet
Posté le 22-03-2004 à 16:57:34  profilanswer
 


Code :
  1. if ( ctrl = init_mat(G->nb_col, G->nb_col - G->nb_lig ))
  2.     if ( Ik = init_mat(G->nb_col, G->nb_col))
  3.       if ( P = init_mat(G->nb_col - G->nb_lig, G->nb_lig)) {
  4. Ik = identite_n(G->nb_col - G->nb_lig);
  5. for (i = 0; i < G->nb_lig; i++, iP++)
  6.   for (j = G->nb_col - G->nb_lig - 1, jP = 0; j < G->nb_col; j++, jP++)
  7.     P->coeff[iP][jP] = G->coeff[i][j];  // On récupère la matrice P
  8. if ( Pt = init_mat(P->nb_lig, P->nb_col) ){
  9.   Pt = transpose(P);
  10.   for (i = 0; i < ctrl->nb_lig; i++)
  11.     for ( j = 0; j < G->nb_lig; j++)
  12.       ctrl[i][j] = Pt[i][j];
  13.   return(ctrl);


 
Bon la j'ai un autre problème. Ca me dit value is neither array nor pointer
 sur la ligne ou je fais ctrl[i][j] = Pt[i][j];
Pourtant Pt est bon ( quand je le retourne je peux l'afficher mais sinon nan )

n°2310
Fafounet
Posté le 22-03-2004 à 17:46:14  profilanswer
 

Laissez tomber je dis n'imp

n°2312
Deadog
Dain Bramaged
Posté le 23-03-2004 à 01:18:25  profilanswer
 

Fafounet a écrit :

Ah par contre la j'ai un truc bien con
Program received signal SIGSEGV, Segmentation fault.
0x40099836 in _IO_adjust_column () from /lib/libc.so.6
 
Tout s'éxécute dans mon main sauf ca ! ( ca ne vient pas de ma fct écrite ci dessus )


 
 
tape "bt" dans gdb pour voir une pile détaillé des fonctions éxécuté ki ont mené à l'erreur, c pas du tout un bug dans la libc ;)
(bt = backtrace)

mood
Google
Posté le 23-03-2004 à 01:18:25  profilanswer
 


Aller à :
Ajouter une réponse

  FORUM Syndrome-OC - Jacky-PC


  Programmation


  Langage haut niveau(C, Pascal...)


  Need help en C [ Matrice à partir d'un fichier ]

 

Hit Parade