Problème sur un flux de lecture à partir d'un fichier .txt - C++ - Programmation
Marsh Posté le 07-08-2006 à 13:34:29
Salut,
tu es en train de réinventer la roue en faisant à la main tes lectures de nombres. Il serait beaucoup plus simple d'utiliser les outils que te propose le C++.
Pour lire des nombres dans ton fichier d'entrée, il te suffit d'utiliser l'opérateur >> (exactement de la même manière que lorsque tu utilises l'opérateur << pour écrire sur un flux de sortie).
Exemple:
Code :
|
Marsh Posté le 07-08-2006 à 13:55:59
franceso a écrit : Salut,
|
Merci pour ta réponse je savais bine que je me trompais dans ma démarche ça ne pouvais pas être aussi complqiué que ça. Mais comme je suis débutant en c++ je butte encore sur la facçon d'utiliser l'opératuer par exemple je voudrais traiter un à un les éléments issus de mon fichier txtx pour les stcoker dans une classe matrice prédifini auparavant par une bibliothèque mathématique.
Par exmple le premier élément représente la dimension. Il faudrait que je le recupère et ensuite qu'il définisse la dimension grace au code :
element1 représente ici le premier element issu de moin fichier .txt en l'occurence dans l'exemple ci-dessus : 3
Code :
|
Puis pour les autres éléments je voudrais les stocker dans la matrice :
Code :
|
Bien sur SymmetricMatrix est déjà défini dans une librairie attaché à mon projet.
Peux-tu m'aider car vraiment je butte sur cette partie?
Merci
Marsh Posté le 07-08-2006 à 14:13:48
Par exemple pour la lecture de la taille de ta matrice, tu devrais remplacer les lignes suivantes
Citation :
|
par une simpel utilisation de l'opérateur >> :
Code :
|
Apres, pour remplir la matrice, c'est pareil : il te suffit de lire tes nombres un par un dans le fichier. En gros ça te donnera quelque chose dans ce style là :
Code :
|
Marsh Posté le 07-08-2006 à 14:19:32
franceso a écrit : Par exemple pour la lecture de la taille de ta matrice, tu devrais remplacer les lignes suivantes
|
merci pour ta réponse. Effectivement c'est ce que j'ai commencé à faire je te tiens au courant et encore merci pour ton aide
Marsh Posté le 07-08-2006 à 14:40:19
Par contre au niveau des boucles ça coince toujours, voilà ce que j'ai mis, mais apparament il n'arrive pas à lire l'élément (i,j) = (2,2) = 1.26E-02
Je dois me tromper dans la mise en place des boucles, mais pour moi ca devrai marcher, qu'en penses-tu???
Code :
|
Marsh Posté le 07-08-2006 à 14:49:50
Est-ce que c'est normal que tes indices i,j commencent à 1 ?
Que veux tu dire par "il n'arrive pas à lire l'élément (2,2)" ? Qu'est-ce qui se passe juste avant l'erreur ; qu'est-ce qui se passe au moment où tu tentes de lire l'élément (2,2) ?
Pourquoi ta boucle en i n'est-elle pas un simple for( int i=1 ; i<=val1 ; ++i ) ?
Marsh Posté le 07-08-2006 à 15:05:04
franceso a écrit : Est-ce que c'est normal que tes indices i,j commencent à 1 ? |
Je ne pense pas que ça chnage grand chose en comparaisant avec le do.
N'hésite pas si tu as d'autres question ça me permet de vérifier de mon côté si je suis sur la bonne voie, Je pense que ça vient du fait qu'un à moemnt covariance(i,j) est mal incrementrée???
Marsh Posté le 07-08-2006 à 15:22:00
Hmm, tout cela ressemble fort à une erreur de segmentation...
Peux-tu me dire un peu mieux comment marche ta classe SymmetricMatrix ? C'est toi qui l'as programmée, ou elle vient d'une bibliothèque extérieure déjà testée ?
Si tu enlèves uniquement la ligne cout << covariance(j,i) << endl; (mais pas le cout << covariance(i,j) ) est-ce que ça plante ou pas ?
Marsh Posté le 07-08-2006 à 15:44:59
franceso a écrit : Hmm, tout cela ressemble fort à une erreur de segmentation... |
Oui, oui ca plante toujours, mais la classe SymmetricMatrix est bien définie car je la teste autre part et ça marche donc cela ne vient pas de sa définition d'utant plus que comme elle est définie comme étant une matrice symétrique .
Le test avec cout << covariance(j,i) << sert seulement à voir si elle marche bien mais comme c'est le cas des deux premier éléments je ne me pose pas trop de questions la dessus je pense plutôt que c'est une errreur d'incrémentation de boucle.
Marsh Posté le 07-08-2006 à 16:36:33
franceso a écrit : Hmm, tout cela ressemble fort à une erreur de segmentation... |
Le test avec cout << covariance(j,i) << sert seulement à voir si elle marche bien mais comme c'est le cas des deux premier éléments je ne pense que cela vienne de la classe SmmetricMatrix.
Par contre j'ai remplacé le <= de la boucle j par le < tout court et bizarrement ça compile jusqu'à l'élément (3,1) en tenant compte de l'élément (2,1).
Je ne comprend pas la raison ???
Marsh Posté le 07-08-2006 à 16:46:26
iamora a écrit : Par contre j'ai remplacé le <= de la boucle j par le < tout court et bizarrement ça compile jusqu'à l'élément (3,1) en tenant compte de l'élément (2,1). |
Tu veux dire que le programme tourne jusqu'à i=3, j=1 et met dans covariance(3,1) la valeur que tu t'attendrais à avoir dans covariance(2,2) ?
La raison est que tel que ton programme est écrit, il ne tient pas compte de l'agencement des données dans le fichier. Il lit juste la suite des valeurs dans l'ordre sans se soucier de la ligne sur laquelle elles sont. Du coup, si ta boucle saute directement de 2,1 à 3,1 la valeur mise dans 3,1 est celle qui suit immédiatement la valeur mise dans 1,2. J'ai l'impression de ne pas être très clair, mais je ne sais pas trop comment l'expliquer mieux.
Marsh Posté le 07-08-2006 à 17:05:26
franceso a écrit : Tu veux dire que le programme tourne jusqu'à i=3, j=1 et met dans covariance(3,1) la valeur que tu t'attendrais à avoir dans covariance(2,2) ? |
En fait que veut tu dire par "Il lit juste la suite des valeurs dans l'ordre " est ce par ordre croissant comment marche >> ???
J'ai remarqué en testant que pour mon programme
covariance(1,2) est équivalent à l'élément (1,1)
covariance(2,3) ou covariance(3,2) est équivalent à l'élément (2,1)
covariance(3,4) est équivalent à l'élément (2,2)
Je ne sais pas pourquoi il saute comme ça??
Marsh Posté le 07-08-2006 à 17:14:31
franceso a écrit : Tu veux dire que le programme tourne jusqu'à i=3, j=1 et met dans covariance(3,1) la valeur que tu t'attendrais à avoir dans covariance(2,2) ? |
Bon je vois ce que tu veux dire. Est ce que je peux par changer le code de telle façon à ce que val stocke les valeurs qu'elle prend dans des adresses qui se suivent grâce à une boucle genre un tableau puis dire à covariance(i,j) de prendre ses valeurs???
Marsh Posté le 07-08-2006 à 11:46:22
Bonjour,
Je rencontre une grande difficulté pour créer une fonction qui puisse lire à partir d'un fichier ".txt" une matrice trinagulaire supérieure et la stocker dans une variable matrice que j'ai définie préalablement.
N'étant pas expert en c++, j'ai codé en faisant abstraction de la gestion dynamique de la mémoire ce qui me joue des tours maintenant.
J'ai établi un code qui marche dans certains cas et qui est le suivant :
Ce code marche bien sur des matrices de types suivant :
Ma définition qui fixe la dimension de temp à 9, devient fausse puisque celle-ci avec le signe moins deviens égale à 10.
Aurriez vous une idée qui puisse contourner le problème??.
J'ai pensé à imbriquer une instruction if à l'intérieure de ma boucle qui test si le premier caractère est "-" et à ce moment fait une réallocation de temp pour porter sa dimension à 10. Mais je ne sais pas comment coder ça en c++. Auriez vous une idée à me proposer, je suis vraiment bloquer la dessus ??
Merci de votre aide