Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ecrire un vecteur de données dans un fichier txt.

Sujet résolu
Anonyme
27 septembre 2021 à 14:39:34

Bonjour,

Je souhaite échanger avec vous au sujet d'un problème de programmation auquel je fais face en ce moment. 

L'objectif est de lire et d'écrire un vector de données dans un fichier txt. 

Pour écrire un vector<double> dans un fichier txt, j'ai implémenté la routine suivante : 

void writeTXT(char* name, vector<double> sig){
FILE* fid;
fid = fopen(name,"w");
fprintf(fid, "%d\n",sig.size());
for(int i=0;i<sig.size();i++) {
fprintf(fid, "%.15lf\n",sig[i]);
}
fclose(fid);
}

Ce bout de code permet d'écrire la dimension du vector en première ligne puis écrire la valeur de chauqe case du même vecteur dans une ligne séparément.

Pour lire le même type de vector à partir d'un fichier txt, j'ai implémenté la routine suivante : 

vector<double> readTXT(char* name){
vector<double> res;
FILE* fid;
fid = fopen (name,"r");
int nbTerm;
fscanf(fid,"%d",&nbTerm);
for(int i=0;i<nbTerm;i++) {
double val;
fscanf(fid,"%lf",&val);
res.push_back(val);
}
fclose(fid);
return res;
}

Maintenant, je souhaite généraliser cette démarche pour des vector<Vecteur> et des vector<MatriceL> tel que Vecteur et MatriceL sont définis respectivement dans des class : 

Vecteur(int Dim, vector<double> V)
{
dim = Dim;
for(int i=0; i<V.size();i++)
{
v.push_back(V[i]);
}
et 
}
MatriceL(int Dim) {
dimX = Dim;
dimY = Dim;
for (int i=0; i<dimX; i++) {
vector<double> tmpC;
val.push_back(tmpC);
vector<int> tmpI;
indexL.push_back(tmpI);
}
is_ILU = false;
}

La question est : Comment modifier writeTXT er readTXT de telle manière à pouvoir écrire dans un fichier txt des données de type vector<Vecteur> et vector<MatriceL> ? 

Je vous serai reconnaisant pour toute remarque ou critique constructive. 

2HA.

-
Edité par Anonyme 27 septembre 2021 à 17:17:32

  • Partager sur Facebook
  • Partager sur Twitter
27 septembre 2021 à 15:21:10

Bonjour, est ce que tu peux éditer ton message et remplacer et copier ton code en utilisant la balise code de l'éditeur de message, c'est le bouton comme ça : </>
Là les couleurs claires sur fond blanc c'est illisible 

En tout cas j'arrive à distinguer des trucs comme FILE*, fopen ou fscan dans ton code, c'est des vieux bazarre à la C plutôt que du C++ moderne, regarde du côté de la classe std::ostream pour faire les choses proprement 

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
27 septembre 2021 à 17:07:34

Merci pour ton retour et pour l'information au sujet de la mise en page. 

Certes, le code date de plusieurs années. Je suis entrain de me former au C++ petit à petit tout en produisant un certain nombre de tâches professionnelles. 

Merci également pour la piste que tu m'as communiqué. Voici donc une version rééditée de mon premier message. 

Je souhaite échanger avec vous au sujet d'un problème de programmation auquel je fais face en ce moment. 

L'objectif est de lire et d'écrire un vector de données dans un fichier txt. 

Pour écrire un vector<double> dans un fichier txt, j'ai implémenté la routine suivante : 

void writeTXT(char* name, vector<double> sig){
FILE* fid;
fid = fopen(name,"w");
fprintf(fid, "%d\n",sig.size());
for(int i=0;i<sig.size();i++) {
fprintf(fid, "%.15lf\n",sig[i]);
}
fclose(fid);
}

Ce bout de code permet d'écrire la dimension du vector en première ligne puis écrire la valeur de chauqe case du même vecteur dans une ligne séparément.

Pour lire le même type de vector à partir d'un fichier txt, j'ai implémenté la routine suivante : 

vector<double> readTXT(char* name){
vector<double> res;
FILE* fid;
fid = fopen (name,"r");
int nbTerm;
fscanf(fid,"%d",&nbTerm);
for(int i=0;i<nbTerm;i++) {
double val;
fscanf(fid,"%lf",&val);
res.push_back(val);
}
fclose(fid);
return res;
}

Maintenant, je souhaite généraliser cette démarche pour des vector<Vecteur> et des vector<MatriceL> tel que Vecteur et MatriceL sont définis respectivement dans des class : 


Vecteur(int Dim, vector<double> V)
{
dim = Dim;
for(int i=0; i<V.size();i++)
{
v.push_back(V[i]);}

et 

MatriceL(int Dim) {
dimX = Dim;
dimY = Dim;
for (int i=0; i<dimX; i++) {
vector<double> tmpC;
val.push_back(tmpC);
vector<int> tmpI;
indexL.push_back(tmpI);
}
is_ILU = false;
}

La question est : Comment modifier writeTXT er readTXT de telle manière à pouvoir écrire dans un fichier txt des données de type vector<Vecteur> et vector<MatriceL> ? 

Je vous serai reconnaissant pour toute remarque ou critique constructive. 




-
Edité par Anonyme 27 septembre 2021 à 17:10:08

  • Partager sur Facebook
  • Partager sur Twitter
27 septembre 2021 à 20:51:09

ThibaultVnt a écrit:

En tout cas j'arrive à distinguer des trucs comme FILE*, fopen ou fscan dans ton code, c'est des vieux bazarre à la C plutôt que du C++ moderne...

Oui c'est du C. ces fonctions ne sont pas obsolètes, elles sont toujours utilisée en C. Elles ne sont que du vieux bazar en C++.

  • Partager sur Facebook
  • Partager sur Twitter
28 septembre 2021 à 8:26:58

J'ai pas dis que ces fonctions étaient obsolètes. Mais comme on est sur le forum C++ et pas sur le forum C, c'est du vieux bazarre qui n'a rien à faire dans son code
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
28 septembre 2021 à 11:33:11

Il s'agit là d'une petite partie du code qui fait plusieurs milliers de lignes de codes dans le but de résoudre des équations aux dérivées partielles par la méthode des éléments finis; et qui a pris de longues années à être implémenté. 

Ce n'est pas évident de tout transposer sur C++ d'un coup. L'idée est de profiter de la flexibilité des variables vector pour des raisons fonctionnelles. 

J'espère que ce message sera lu par un lecteur plus soucieux du pragmatisme que par du conformisme. 

  • Partager sur Facebook
  • Partager sur Twitter
28 septembre 2021 à 11:43:26

HamzaHafidiAlaoui2 a écrit:

Il s'agit là d'une petite partie du code qui fait plusieurs milliers de lignes de codes...

Dans ce cas, il faudrait indenter ton code correctement, même si ce n'est pas ce qui t'importe, il faut quand même penser à ceux qui le lisent, parce que là, ça arrache les yeux.
  • Partager sur Facebook
  • Partager sur Twitter
28 septembre 2021 à 11:54:56

>plus soucieux du pragmatisme

C'est bien plus pragmatique de prendre 3 minutes pour se débarrasser de ces putains de vieilles API pleines de beau de banane et de trous de sécurité que de passer 3 ans à comprendre que des problème à la cons viennent de ces vieilleries. Et cette remarque n'a rien d'hypothétique.

Mais bon, le conservatisme (pusillanimité ?), c'est un réflexe "naturel".

Mais bon ce réflexe est délétère à long terme.

La preuve ? Bin ce que vous voulez faire c'est un truc "bateau" en POO, c'est de la sérialisation/désérialisation d'objet. C'est un truc "trivial" en utilisant les framework fait pour, mais eux, ils ont tendance à ne pas supporter des vieilleries qui n'ont jamais fait partie du C++ (autrement que par rétro-compatibilité et par manque de librairies "system").

En résumé, arrêtez de réinventer une roue carrée avec des silex et utilisez les outils faits pour.

-
Edité par bacelar 28 septembre 2021 à 11:55:10

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.