Remplir un tableau en C d'après un fichier .txt

Discutez d'informatique ici !
coqp-ox
Membre Naturel
Messages: 52
Enregistré le: 22 Nov 2013, 11:00

Remplir un tableau en C d'après un fichier .txt

par coqp-ox » 09 Déc 2013, 17:59

Bon voila, j'ai trouvé sur le net (encore une fois) un programme en C capable de résoudre un système du type AX=B pour peur qu'on lui donne tous les coefficients des différentes matrices/vecteurs.
Or, étant donné que ma matrice A pourrait contenir jusqu'à 32 points, j'utilise un fichier .txt pour avoir les valeurs de ma matrice.
Le problème étant que je n'arrive pas à utiliser ce fichier en C (pourtant j'y arrive en C++) et je ne trouve pas la fonction adéquate sur google donc je m'adresse à vous pour demander un peu d'aide :we:

Voila le bout de code concerné

[HTML]void saisie_mat(float **A ,int n)
{
int i=0 , j=0 ;
printf(" ===>Saisie de la matrice : \n\n\n");


FILE* fichier = NULL;
fichier = fopen("matrice.txt", "r+" );

for (i = 0 ; i < n ; i++)
{
for (j = 0 ; j < n ; j++)
{
fscanf(fichier, "%d %d", &i, &j);
}
}

}[/HTML]

Je pensais que cette méthode était la bonne cependant même si le code compile le programme signale une erreur en cours de route :mur:
Merci d'avance pour votre aide !

De plus, pensez-vous que gauss soit une bonne méthode même avec des nombres qui possèdent un grand nombre de décimales ?



Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 09:03

par ampholyte » 09 Déc 2013, 18:14

Bonjour,

Je n'ai pas très bien compris ce que tu essayes de faire.

Tu souhaites que l'utilisateur rentre la matrice et que celle-ci soit sauvegarder dans un fichier ? Ou souhaites-tu lire le fichier ?

joel76
Membre Relatif
Messages: 230
Enregistré le: 11 Fév 2013, 17:31

par joel76 » 09 Déc 2013, 19:14

coqp-ox a écrit:Bon voila, j'ai trouvé sur le net (encore une fois) un programme en C capable de résoudre un système du type AX=B pour peur qu'on lui donne tous les coefficients des différentes matrices/vecteurs.
Or, étant donné que ma matrice A pourrait contenir jusqu'à 32 points, j'utilise un fichier .txt pour avoir les valeurs de ma matrice.
Le problème étant que je n'arrive pas à utiliser ce fichier en C (pourtant j'y arrive en C++) et je ne trouve pas la fonction adéquate sur google donc je m'adresse à vous pour demander un peu d'aide :we:

Voila le bout de code concerné

[HTML]void saisie_mat(float **A ,int n)
{
int i=0 , j=0 ;
printf(" ===>Saisie de la matrice : \n\n\n");


FILE* fichier = NULL;
fichier = fopen("matrice.txt", "r+" );

for (i = 0 ; i < n ; i++)
{
for (j = 0 ; j < n ; j++)
{
fscanf(fichier, "%d %d", &i, &j);
}
}

}[/HTML]

Il y aura un problème de saisie, puisque %d est réservé aux entiers pas au flottants.
D'autre part tu utilises i et j comme compteurs de boucle et arguments de saisie, pas étonnant que le prog plante.

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 20:42

par Rockleader » 09 Déc 2013, 20:31

Alors avec ma maigre expérience du C et mes questions presque en continus depuis plusieurs mois je ne serais surement pas la bonne personne à écouter; mais je vais quand même donner mon avis (à prendre avec des pincettes et qui sera surement réfuté si je fais erreur).


Première chose; j'aurais rajouté un fclose(fichier) à la fin pour être sur que ça ne fasse pas planter.

Ensuite avec ton fscanf si je me trompe pas tu stockes dans les adresses de i et j deux entiers contenus dans ta matrice. Je ne pense pas que le but recherché soit de stocker là.

Et dernier point écris comme ça ta matrice fera forcement 2 en colonne. Vu que tu ne récupère que deux valeurs dans ton fscanf.

Si ta matrice est déjà dans un fichier alors je ne vois pas l’intérêt des compteurs i et j il te faut simplement traiter le fichier.




Voilà milles excuses si mes remarques ne sont pas constructives ou erronées; j'ai voulu tenter ma chance ;)
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

coqp-ox
Membre Naturel
Messages: 52
Enregistré le: 22 Nov 2013, 11:00

par coqp-ox » 09 Déc 2013, 22:52

ampholyte a écrit:Bonjour,

Je n'ai pas très bien compris ce que tu essayes de faire.

Tu souhaites que l'utilisateur rentre la matrice et que celle-ci soit sauvegarder dans un fichier ? Ou souhaites-tu lire le fichier ?


Non j'essaye de lire la matrice (présente sur un fichier txt sur mon bureau) pour ensuite utiliser la methode de gauss etc...

Joel et Rock, maintenant que vous le dites c'est vrai que je remarque qu'il y a un problème avec mes compteurs. Cependant je n'y connais absolument rien en C, en fait les seuls programmes qui traduisent la méthode de Gauss sont en C donc j'essaye d'en adapter un à ma situation (le programme qui précède étant en C++).

joel76
Membre Relatif
Messages: 230
Enregistré le: 11 Fév 2013, 17:31

par joel76 » 09 Déc 2013, 22:54

Rockleader a écrit:Première chose; j'aurais rajouté un fclose(fichier) à la fin pour être sur que ça ne fasse pas planter.
Remarque tout à fait pertinente :++:

Ensuite avec ton fscanf si je me trompe pas tu stockes dans les adresses de i et j deux entiers contenus dans ta matrice. Je ne pense pas que le but recherché soit de stocker là.
Bien vu (mais je l'avais déjà ecrit ...) :lol3:

Et dernier point écris comme ça ta matrice fera forcement 2 en colonne. Vu que tu ne récupère que deux valeurs dans ton fscanf.
Ça semble logique :id:

Si ta matrice est déjà dans un fichier alors je ne vois pas l’intérêt des compteurs i et j il te faut simplement traiter le fichier.
Ça se discute.
Voilà milles excuses si mes remarques ne sont pas constructives ou erronées; j'ai voulu tenter ma chance ;)
Tu n'as pas à t'excuser, tout le monde à droit de participer et les discussions sont toujours enrichissantes.

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 20:42

par Rockleader » 09 Déc 2013, 23:45

Bon bah je suis content de voir que je suis pas complètement à l'ouest x)
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

joel76
Membre Relatif
Messages: 230
Enregistré le: 11 Fév 2013, 17:31

par joel76 » 10 Déc 2013, 01:54

Voilà un code qui permet de lire un fichier de données sous forme de texte.
La première ligne permet de savoir combien il y a de lignes et de colonnes.
3 4
-2.5 1.665 2.34 7.89
-9.57 6.748 -3.754 -2.569
2.258 -3.58 0.495 3.458

Le code pour créer, lire, afficher et enfin libérer le tableau :
Code: Tout sélectionner
#include
#include
#include
#include

double ** load(size_t *lig, size_t *col)
{
   double **A = NULL;
   FILE *f = fopen("C:\\a-travail\\developpements\\Visual Studio\\C\\lire_tableau\\lire_tableau\\data.txt", "r");
   char buf[1024];
   char *tok;
   size_t i, j, k;

   if (f == NULL)
   {
      puts("pb ouverture fichier");
      exit(0);
   }

   if ((fgets(buf, sizeof(buf), f) == NULL) || (sscanf(buf, "%d %d", lig, col) != 2))
   {
      puts("pb lecture fichier");
      fclose(f);
      exit(0);
   }
   printf("%d lignes de %d colonnes\n\n", *lig, *col);

   if ((A = calloc(*lig, sizeof(*A))) == NULL)
   {
      puts("pb 1 allocation mémoire");
      fclose(f);
      exit(0);
   }

   for(i = 0; i < *lig; i++)
   {
      if ((A[i] = calloc(*col, sizeof(**A))) == NULL)
      {
         size_t k;
         for(k = 0; k < i; k++)
            free(A[k]);

         free(A);
         puts("pb 2 allocation mémoire");
         fclose(f);
         exit(0);
      }
      if (fgets(buf, sizeof(buf), f) == NULL)
      {
         size_t k;
         for(k = 0; k <= i; k++)
            free(A[k]);

         free(A);
         puts("pb 1 lecture fichier");
         fclose(f);
         exit(0);
      }
      for(j = 0, tok = strtok(buf, " ") ; j < *col; j++, tok = strtok(NULL, " "))
      {
         A[i][j] = strtod(tok, NULL);
      }
   }
   return A;
}

void my_free(double **A, size_t lig)
{
   size_t i;

   for(i = 0; i < lig; i++)
   {
      free(A[i]);
   }

   free(A);
}

void affiche(double **A, size_t lig, size_t col)
{
   size_t i, j;

   for(i = 0; i < lig; i++)
   {
      for(j = 0; j < col; j++)
         printf("%0.5lf ", A[i][j]);

      puts("");
   }
}

int main()
{
   double **A = NULL ;
   size_t lig, col;
   A = load(&lig, &col);

   affiche(A, lig, col);

   my_free(A, lig);

 _getch();
 return 0;
}
J'ai peut-être un peu abusé des vérifications.

coqp-ox
Membre Naturel
Messages: 52
Enregistré le: 22 Nov 2013, 11:00

par coqp-ox » 10 Déc 2013, 11:00

joel76 a écrit:Voilà un code qui permet de lire un fichier de données sous forme de texte.
La première ligne permet de savoir combien il y a de lignes et de colonnes.

Le code pour créer, lire, afficher et enfin libérer le tableau :
Code: Tout sélectionner
#include
#include
#include
#include

double ** load(size_t *lig, size_t *col)
{
   double **A = NULL;
   FILE *f = fopen("C:\\a-travail\\developpements\\Visual Studio\\C\\lire_tableau\\lire_tableau\\data.txt", "r");
   char buf[1024];
   char *tok;
   size_t i, j, k;

   if (f == NULL)
   {
      puts("pb ouverture fichier");
      exit(0);
   }

   if ((fgets(buf, sizeof(buf), f) == NULL) || (sscanf(buf, "%d %d", lig, col) != 2))
   {
      puts("pb lecture fichier");
      fclose(f);
      exit(0);
   }
   printf("%d lignes de %d colonnes\n\n", *lig, *col);

   if ((A = calloc(*lig, sizeof(*A))) == NULL)
   {
      puts("pb 1 allocation mémoire");
      fclose(f);
      exit(0);
   }

   for(i = 0; i < *lig; i++)
   {
      if ((A[i] = calloc(*col, sizeof(**A))) == NULL)
      {
         size_t k;
         for(k = 0; k < i; k++)
            free(A[k]);

         free(A);
         puts("pb 2 allocation mémoire");
         fclose(f);
         exit(0);
      }
      if (fgets(buf, sizeof(buf), f) == NULL)
      {
         size_t k;
         for(k = 0; k <= i; k++)
            free(A[k]);

         free(A);
         puts("pb 1 lecture fichier");
         fclose(f);
         exit(0);
      }
      for(j = 0, tok = strtok(buf, " ") ; j < *col; j++, tok = strtok(NULL, " "))
      {
         A[i][j] = strtod(tok, NULL);
      }
   }
   return A;
}

void my_free(double **A, size_t lig)
{
   size_t i;

   for(i = 0; i < lig; i++)
   {
      free(A[i]);
   }

   free(A);
}

void affiche(double **A, size_t lig, size_t col)
{
   size_t i, j;

   for(i = 0; i < lig; i++)
   {
      for(j = 0; j < col; j++)
         printf("%0.5lf ", A[i][j]);

      puts("");
   }
}

int main()
{
   double **A = NULL ;
   size_t lig, col;
   A = load(&lig, &col);

   affiche(A, lig, col);

   my_free(A, lig);

 _getch();
 return 0;
}
J'ai peut-être un peu abusé des vérifications.


Le C++ vaincra :marteau: !

Un énorme merci pour le code Jojo, cependant mon compiler repère une erreur à cette ligne :

[HTML]if ((A[i] = calloc(*col, sizeof(**A))) == NULL)
error: invalid conversion from `void*' to `double*'|[/HTML]

J'essaye de résoudre ce problème tout seul mais un peu d'aide ne serait pas de refus ^^

Encore merci! :zen:

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 09:03

par ampholyte » 10 Déc 2013, 11:03

coqp-ox a écrit:Le C++ vaincra :marteau: !

Un énorme merci pour le code Jojo, cependant mon compiler repère une erreur à cette ligne :

[HTML]if ((A[i] = calloc(*col, sizeof(**A))) == NULL)
error: invalid conversion from `void*' to `double*'|[/HTML]

J'essaye de résoudre ce problème tout seul mais un peu d'aide ne serait pas de refus ^^

Encore merci! :zen:


Essaye de rajouter -std=gnu99 à tes options de compilation. Après je n'ai pas testé, il y a peut-être d'autres problèmes ailleurs.

coqp-ox
Membre Naturel
Messages: 52
Enregistré le: 22 Nov 2013, 11:00

par coqp-ox » 10 Déc 2013, 11:19

ampholyte a écrit:Essaye de rajouter -std=gnu99 à tes options de compilation. Après je n'ai pas testé, il y a peut-être d'autres problèmes ailleurs.


J'ai essayé mais sans réussite, j'ai cherché et apparemment mon compiler (codeblocks) essaye de compiler en C++, je tente de régler ca !

joel76
Membre Relatif
Messages: 230
Enregistré le: 11 Fév 2013, 17:31

par joel76 » 10 Déc 2013, 11:31

Attention, ceci est un code C qui doit être compilé avec le compilateur C et non pas C++, donc il faut l'écrire dans un fichier d'extension .c.
En C, il n'est pas nécessaire de caster malloc

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 09:03

par ampholyte » 10 Déc 2013, 11:33

joel76 a écrit:Attention, ceci est un code C qui doit être compilé avec le compilateur C et non pas C++, donc il faut l'écrire dans un fichier d'extension .c.
EN, il n'est pas nécessaire de caster malloc


Oui tout à fait, je ne le fais jamais, mais à une certaine époque (suivant le compilateur), il était nécessaire de le faire, d'où mon indication.


Si tu es dans code block, vérifie bien que ton projet est un projet C et que tes fichiers aient des extensions en .c

joel76
Membre Relatif
Messages: 230
Enregistré le: 11 Fév 2013, 17:31

par joel76 » 10 Déc 2013, 11:39

Ça ne va pas te plaire, je travaille avec VS 2010 :we:

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 09:03

par ampholyte » 10 Déc 2013, 11:51

joel76 a écrit:Ça ne va pas te plaire, je travaille avec VS 2010 :we:


Je répondais à oqp-ox pour code block :D

coqp-ox
Membre Naturel
Messages: 52
Enregistré le: 22 Nov 2013, 11:00

par coqp-ox » 10 Déc 2013, 12:07

Que signifie "caster" ?

Mon fichier est bien au format .c...après plusieurs tentatives, il se trouve que je vais dans le :mur:

J'ai suivi tous les conseils que j'ai pu trouvé pour bien compiler en C mais aucun n'a fonctionné ><

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 09:03

par ampholyte » 10 Déc 2013, 12:13

Caster signifie forcé le type d'une variable. Exemple :

Code: Tout sélectionner
int a = 3;
double b = (double)a;


Ici on caste la variable a.

Essaye de créer un nouveau projet et sélectionne bien langage C lors de la création, si tu ne peux pas choisir essaye de regarder dans Project/Build options (de mémoire, je n'utilise plus code block depuis un moment).

Peux-tu nous mettre la ligne de compilation qui s'affiche ?

joel76
Membre Relatif
Messages: 230
Enregistré le: 11 Fév 2013, 17:31

par joel76 » 10 Déc 2013, 12:14

Je ne connais pas CodeBlock. Je pense que tu devrais avoir avoir un warning simplement, le code doit compiler.
Quels sont les messages d'erreur ?

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 20:42

par Rockleader » 10 Déc 2013, 12:15

Si j'étais toi je recréerais un projet en C bien propre et je ferais un copier coller du code dans ce nouveau fichier; manière d'être sur que tu as les bonnes options.

Je me rappelle avoir évoqué ce problème il y a quelques moi; code block ne me gérait pas certaines fonctions; il fallait donc que je travaille directement en ligne de commande. D'où l'avantage de linux ;).


EDIT: un ami m'a fait découvrir un nouvel éditeur que je trouve franchement mieux que code blocks et qui gère presque tout les langages: sublime text.

Logiciel libre avec possibilité de souscrire à une licence pour aider le dev. Je ne te garantis pas que cela règlera le soucis; mais depuis que j'utilise ce logiciel pour coder je vois les choses d'un autre œil ;)
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

joel76
Membre Relatif
Messages: 230
Enregistré le: 11 Fév 2013, 17:31

par joel76 » 10 Déc 2013, 12:22

Essaie Emacs, il parait qu'il n'y a rien de mieux. Moi je ne l'utilise que pour faire du Prolog sous Linux (quand l'envie m'en prend) mais il parait qu'on peut tout faire avec, une fois l'apprentissage passé.

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite