Problème sur un flux d'entrée à partir d'un fichier.txt
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:
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 :
Citation:
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 :
Citation:
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