Bonjour,

J'avais évoqué auparavant n ma 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.

Je vous rapelle mon code qui marche dans certains cas et qui est le suivant :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
Code :
#include "essai.h"
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
 
 
using namespace std;
 
int main()
{
  // Ouverture du fichier
		 ifstream fichierEntree("c:\\test1.txt", ios::in);
 
  // Test d'ouverture du fichier
    if (!fichierEntree) {
        cerr << "Problème d'ouverture de fichier" << endl;
        exit(1);
    }
 
    char* ligne;
    int i = 0;
    char * err = NULL;
	//double z; 
 
    ligne = new char[10];
    fichierEntree.getline(ligne, 4);
    int conv1 = strtoul(ligne,0,10);
	ArrayLengthSpecifier dimension(conv1);
	cout << conv1 << endl;
	SymmetricMatrix covariance(dimension);
 
    int longueur;
 
    do
		 {
		 i = i + 1;
		 longueur = 9 * i + 1;
		 ligne = new char [longueur];//format "0.00E+00"
		 //donc 8 caractères; 9i=8i+ (i-1) espaces + élt nul terminal
		 fichierEntree.getline(ligne,longueur);
		 cout << ligne << endl;
 
 
		 for (int j=1;j<=i;j++)
		{
			char temp[9];
			for (int k=0;k<=7;k++)
			{	
				temp[8]=0;
				if (j==1)
				temp[k] = ligne[k];
				else
				temp[k] = ligne[9* (j - 1) + k ];//attention dimension de 0 à n-1
 
			}
			const char* caractere=temp;
			cout << caractere << endl;
			covariance(i,j) = 2 * strtod(caractere, &err); 
			cout << covariance(i,j) << endl;
			cout << covariance(j,i) << endl;
		}
		delete[] ligne;	
 
		 }
		 while (!fichierEntree.eof());
 
    fichierEntree.close();
}
Ce code marche bien sur des matrices de types suivant :


Code :
3
1.23E-02
1.24E-02 1.26E-02
1.27E-02 1.23E-04 1.23E-03
Par contre dès qu'il s'agit d'une matrice qui contient un nombre négatif (par exemple) :


Code :
3
1.23E-02
-1.24E-02 1.26E-02
1.27E-02 1.23E-04 1.23E-03
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