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, 10:00
-
par coqp-ox » 09 Déc 2013, 16: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 ?
-
ampholyte
- Membre Transcendant
- Messages: 3940
- Enregistré le: 21 Juil 2012, 08:03
-
par ampholyte » 09 Déc 2013, 17: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, 16:31
-
par joel76 » 09 Déc 2013, 18: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.
-
Rockleader
- Habitué(e)
- Messages: 2126
- Enregistré le: 11 Oct 2011, 19:42
-
par Rockleader » 09 Déc 2013, 19: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 linté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, 10:00
-
par coqp-ox » 09 Déc 2013, 21: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, 16:31
-
par joel76 » 09 Déc 2013, 21: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 linté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.
-
Rockleader
- Habitué(e)
- Messages: 2126
- Enregistré le: 11 Oct 2011, 19:42
-
par Rockleader » 09 Déc 2013, 22: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, 16:31
-
par joel76 » 10 Déc 2013, 00: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, 10:00
-
par coqp-ox » 10 Déc 2013, 10: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:
-
ampholyte
- Membre Transcendant
- Messages: 3940
- Enregistré le: 21 Juil 2012, 08:03
-
par ampholyte » 10 Déc 2013, 10: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, 10:00
-
par coqp-ox » 10 Déc 2013, 10: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 !
-
ampholyte
- Membre Transcendant
- Messages: 3940
- Enregistré le: 21 Juil 2012, 08:03
-
par ampholyte » 10 Déc 2013, 10:33
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, 16:31
-
par joel76 » 10 Déc 2013, 10:39
Ça ne va pas te plaire, je travaille avec VS 2010 :we:
-
ampholyte
- Membre Transcendant
- Messages: 3940
- Enregistré le: 21 Juil 2012, 08:03
-
par ampholyte » 10 Déc 2013, 10:51
joel76 a écrit:Ça ne va pas te plaire, je travaille avec VS 2010 :we:
Je répondais à oqp-ox pour code block
-
coqp-ox
- Membre Naturel
- Messages: 52
- Enregistré le: 22 Nov 2013, 10:00
-
par coqp-ox » 10 Déc 2013, 11: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é ><
-
ampholyte
- Membre Transcendant
- Messages: 3940
- Enregistré le: 21 Juil 2012, 08:03
-
par ampholyte » 10 Déc 2013, 11: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, 16:31
-
par joel76 » 10 Déc 2013, 11: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 ?
-
Rockleader
- Habitué(e)
- Messages: 2126
- Enregistré le: 11 Oct 2011, 19:42
-
par Rockleader » 10 Déc 2013, 11: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, 16:31
-
par joel76 » 10 Déc 2013, 11: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é.
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 7 invités