Lecture/Ecriture fichier texte + simplification

[Résolu]
Signaler
-
 deschanp -
Bonjour à tous !

Voila je débute et développe en c++ sous VC++ 6.0 et je me heurte à une erreur que je n'arrive pas à résoudre.

Voici déjà un extrait de mon code :

Fonction d'enregistrement du fichier texte
void EnregistrerFichier() 
{ 
ofstream fileobject; 
fileobject.open("Résultats Simulateurs/RésultatsTest.txt", ios::out); //on ouvrre le fichier en ecriture 
if (fileobject.bad()) //permet de tester si le fichier s'est ouvert sans probleme 
return;
fileobject.clear();
fileobject << "*************************************" << endl;
fileobject << "*Données Analogiques Entrées Calculs*" << endl;
fileobject << "*************************************" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| A000 " << DeltaP_T.A000 << " | A001 " << DeltaP_T.A001 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| A002 " << DeltaP_T.A002 << " | A003 " << DeltaP_T.A003 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| A004 " << DeltaP_T.A004 << " | A005 " << DeltaP_T.A005 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| A006 " << DeltaP_T.A006 << " | A007 " << DeltaP_T.A007 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| A008 " << DeltaP_T.A008 << " | A009 " << BilThPrimInst.A009 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| A010 " << BilThPrimInst.A010 << " | A011 " << BilThPrimInst.A011 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| A012 " << BilThPrimInst.A012 << " | A013 " << BilThPrimInst.A013 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| A014 " << BilThPrimInst.A014 << " | A015 " << BilThPrimInst.A015 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| A016 " << BilThPrimInst.A016 << " | A024 " << BilThPrimInst.A024 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| A025 " << BilThPrimInst.A025 << " | A112 " << DeltaP_T.A112 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| A113 " << BilThSec.A113 << " | A114 " << DeltaP_T.A114 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| A115 " << BilThSec.A115 << " | A172 " << BilThSec.A172 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| A173 " << BilThSec.A173 << " | A176 " << BilThSec.A176 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| A177 " << BilThSec.A177 << " | A180 " << BilThSec.A180 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| A181 " << BilThSec.A181 << " | QB23 " << BilThSec.QB23 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| QB24 " << BilThSec.QB24 << " | QB25 " << BilThSec.QB25 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| QB26 " << BilThSec.QB27 << " | QB27 " << BilThSec.QB27 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| MBP " << BilThPrimInst.MBP << " | A069 " << BilThPrimInst.A069 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| MDRG " << BilThPrimInst.MDRG << " | A110 " << BilThPrimInst.A110 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| A111 = " << BilThPrimInst.A111 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "*************************************" << endl;
fileobject << "**Résultats calculs Bilan Thermique**" << endl;
fileobject << "*************************************" << endl;
fileobject << "| Q " << BilThPrimInst.Q << " | PBR " << BilThPrimInst.PBR << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| PDRG " << BilThPrimInst.PDRG << " | PBP " << BilThPrimInst.PBP << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| PPISC " << BilThPrimInst.PPISC << " | MPISC " << BilThPrimInst.MPISC << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| TSPISC " << BilThPrimInst.TSPISC << " | TEPISC " << BilThPrimInst.TEPISC << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| ppsp " << BilThPrimInst.ppsp << " | a2 " << BilThPrimInst.a2 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| b2 " << BilThPrimInst.b2 << " | pBP " << BilThPrimInst.pBP << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| TMRS1 " << BilThPrimInst.TMRS1 << " | TMRS2 " << BilThPrimInst.TMRS2 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| MmRS " << BilThPrimInst.MmRS << " | pmRS " << BilThPrimInst.pmRS << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| a " << BilThPrimInst.a << " | b " << BilThPrimInst.b << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| QD2O " << BilThPrimInst.QD2O << " | epsilon1 " << BilThSec.epsilon1 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| B25 " << BilThSec.B25 << " | B26 " << BilThSec.B26 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| B27 " << BilThSec.B27 << " | B23 " << BilThSec.B23 << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| B24 " << BilThSec.B24 << " | DeltaT " << DeltaP_T.ValDeltaT << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject << "| DeltaP = " << DeltaP_T.ValDeltaP << " |" << endl;
fileobject << "-------------------------------" << endl;
fileobject.close(); //on ferme le fichier pour liberer la mémoire 
return; 
}


Fonction d'ouverture du fichier texte
void OuvrirFichier() 
{ 
//FILE fileobject; 
//fileobject.open("Résultats Simulateurs/RésultatsTest.txt", ios::in); //on ouvrre le fichier en ecriture 
ifstream fileobject("Résultats Simulateurs/RésultatsTest.txt", ios::in);
if (fileobject.bad()) //permet de tester si le fichier s'est ouvert sans probleme 
return;
char val;
std::string line;
fileobject >> val;
while (!fileobject.eof())
{	
while (!isdigit(val))
fileobject.get(val) >> val;
DeltaP_T.A000  = val;
while (!isdigit(val))
fileobject.get(val) >> val;
DeltaP_T.A001 =  val;
while (!isdigit(val))
fileobject.get(val) >> val;
DeltaP_T.A002 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
DeltaP_T.A003 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
DeltaP_T.A004 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
DeltaP_T.A005 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
DeltaP_T.A006 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
DeltaP_T.A007 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
DeltaP_T.A008 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThPrimInst.A009 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThPrimInst.A010 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThPrimInst.A011 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThPrimInst.A012 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThPrimInst.A013 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThPrimInst.A014 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThPrimInst.A015 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThPrimInst.A016 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThPrimInst.A024 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThPrimInst.A025 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThSec.A112 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThSec.A113 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThSec.A114 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThSec.A115 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThSec.A172 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThSec.A173 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThSec.A176 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThSec.A177 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThSec.A180 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThSec.A181 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThSec.QB23 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThSec.QB24= val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThSec.QB25 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThSec.QB26 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThSec.QB27 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThPrimInst.MBP = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThPrimInst.A069 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThPrimInst.MDRG = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThPrimInst.A110 = val;
while (!isdigit(val))
fileobject.get(val) >> val;
BilThPrimInst.A111 = val;
}
return;
}


Structure du fichier texte
*************************************
*Données Analogiques Entrées Calculs*
*************************************
-------------------------------
| A000  0 | A001  0 |
-------------------------------
| A002 0 | A003 0 |
-------------------------------
| A004 0 | A005 0 |
-------------------------------
| A006 0 | A007 0 |
-------------------------------
| A008 0 | A009 0 |
-------------------------------
| A010 0 | A011 0 |
-------------------------------
| A012 0 | A013 0 |
-------------------------------
| A014 0 | A015 0 |
-------------------------------
| A016 0 | A024 0 |
-------------------------------
| A025 0 | A112 0 |
-------------------------------
| A113 0 | A114 0 |
-------------------------------
| A115 0 | A172 0 |
-------------------------------
| A173 0 | A176 0 |
-------------------------------
| A177 0 | A180 0 |
-------------------------------
| A181 0 | QB23 0 |
-------------------------------
| QB24 0 | QB25 0 |
-------------------------------
| QB26 0 | QB27 0 |
-------------------------------
| MBP 0 | A069 0 |
-------------------------------
| MDRG 0 | A110 0 |
-------------------------------
| A111 = 0 |
-------------------------------
*************************************
**Résultats calculs Bilan Thermique**
*************************************
| Q 0 | PBR 0 |
-------------------------------
| PDRG 0 | PBP 0 |
-------------------------------
| PPISC 0 | MPISC 0 |
-------------------------------
| TSPISC 0 | TEPISC 0 |
-------------------------------
| ppsp 0 | a2 0 |
-------------------------------
| b2 0 | pBP 0 |
-------------------------------
| TMRS1 0 | TMRS2 0 |
-------------------------------
| MmRS 0 | pmRS 0 |
-------------------------------
| a 0 | b 0 |
-------------------------------
| QD2O 0 | epsilon1 0 |
-------------------------------
| B25 0 | B26 0 |
-------------------------------
| B27 0 | B23 0 |
-------------------------------
| B24 0 | DeltaT 0 |
-------------------------------
| DeltaP = 0 |
-------------------------------


Fonctionnement général :
La fonction enregistrer récupère des valeurs entrées dans des editbox et les enregistre dans le fichier texte --> OK
La fonction ouvrir va récupérer les valeurs des variables dans le fichier texte et les entrer dans mes editbox --> pas OK..

Voila l'état actuel des choses :
[list]
La fonction enregistrer marche parfaitement mais j'aimerais la simplifier du style : mavariable = Structure.A00 & i. Ce qui ne fonctionne pas et je sèche sur la solution.

La fonction ouvrir ne marche pas du tout, elle me récupère le texte et me le convertit en ASCII je suppose ? Bref rien de bon.. Je cherche également à le simplifier surement de la même manière que la fonction enregistrer.. Mais rien..
/list

Je sais que des tutoriels ou sujets dans des FAQ traitent certains de mes problèmes mais je dois être aveugle...

Merci d'avance pour ceux qui prendraient le temps de lire ce gros pavet, j'espère avoir été assez clair dans mes explications..

6 réponses

Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
122
Bonjour.

Tout d'abord quelques conseils:
- Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- std::ifstream c'est un std::ostream + std::ios::in, donc pas besoin de le repréciser.
- Idem pour std::ofstream.
- Tu peux directement faire un "if (!file)" plutôt que "if (file.bad())".

Pour ton souci, tu peux le faire en générique en utilisant une std::map (tableau associatif).
Tu lis chacune des variables, ce qu'il y a avant un "=", que tu associes à la valeur lue après le "=".
C'est très simple à faire.

Je t'ai fais un exemple propre reprenant ton code. Dans celui-ci, je lis ton fichier, l'associe à une map, et ensuite je l'écris de deux manières différentes. La première écris les valeurs à la main (je n'ai pas tout mis, la flemme ^^) et le deuxième te montre comment écrire les valeurs de manières génériques.
La fonction "showMap" est une simple fonction de débug qui te montre ce que contient ta map.

#include 
#include <fstream>
#include <sstream>
#include <map>

typedef std::map<std::string, int> data_type;

namespace
{
  size_t extractWord(const std::string& line, size_t start, data_type& data)
  {
    const size_t equ = line.find_first_of('=', start);
    if (equ == std::string::npos)
      return 0;

    const size_t begin = line.find_first_of(' ', start) + 1;
    const size_t end = line.find_first_of(' ', equ + 2) - 1;
    const std::string name = line.substr(begin, equ - begin - 1);
    const std::string value = line.substr(equ + 2, end - equ - 1);
    std::istringstream buff(value);
    int val = 0;
    buff >> val;
    data[name] = val;

    return line.find_first_of('|', end);
  }

  void extractLine(const std::string& line, data_type& data)
  {
    const size_t next = extractWord(line, 0, data);
    extractWord(line, next, data);
  }

  bool load(const std::string& filename, data_type& data)
  {
    std::ifstream file(filename.c_str());
    if (!file)
      return false;

    std::string line;
    while (std::getline(file, line))
      extractLine(line, data);

    return true;
  }

  void showMap(const data_type& map)
  {
    data_type::const_iterator end = map.end();
    for (data_type::const_iterator it = map.begin(); it != end; ++it)
      std::cout << "map[" << it->first << "] => " << it->second << std::endl;
  }

  bool save(const std::string& filename, data_type& map)
  {
    std::ofstream file(filename.c_str());
    if (!file)
      return false;

    file << "*************************************\n"
 << "*Données Analogiques Entrées Calculs*\n"
 << "*************************************\n"
 << "-------------------------------\n"
 << "| A000 " << map["A000"] << " | A001 " << map["A001"] << " |\n"
 << "-------------------------------\n"
 << "| A002 " << map["A002"] << " | A003 " << map["A003"] << " |\n"
 << "-------------------------------\n";
         // A compléter.

    return true;
  }

  bool save2(const std::string& filename, const data_type& map)
  {
    std::ofstream file(filename.c_str());
    if (!file)
      return false;

    int i = 0;
    data_type::const_iterator end = map.end();
    for (data_type::const_iterator it = map.begin(); it != end; ++it, ++i)
    {
      if (i % 2 == 0)
file << "-------------------------------\n"
     << "| " << it->first << " = " << it->second << " ";
      else
file << " | " << it->first << " = " << it->second << " |\n";
    }

    return true;
  }
} // namespace

int main()
{
  const std::string filename = "file.txt";
  data_type data;
  if (!load(filename, data))
  {
    std::cerr << "File load fail: " << filename << std::endl;
    return 1;
  }

  showMap(data);

  const std::string outfile = "save.txt";
  if (!save(outfile, data))
  {
    std::cerr << "File save fail: " << outfile << std::endl;
    return 2;
  }

  const std::string outfile2 = "save2.txt";
  if (!save2(outfile2, data))
  {
    std::cerr << "File save2 fail: " << outfile2 << std::endl;
    return 3;
  }

  std::cout << "File saved !" << std::endl;

  return 0;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Je viens de passer mon code en mode debugger et je m'apperçois de ceci :

Pour la séquence de code
while (!isdigit(val))
fileobject.get(val) >> val;
DeltaP_T.A000 = val;


Le programme ne me lit qu'un caractère sur deux. Par exemple pour
Données Analogiques Entrées Calculs

Dans la boucle val passe de la valeur D à n puis é puis s etc...
Est-ce que cela pourrait venir de la ?

Je suis tombé sur ce code ci également :
int entier1, entier2;
                string chaine1, chaine2;
  
                fichier >> entier1 >> entier2 >> chaine1 >> chaine2;


Le fait d'utiliser cette méthode avec uniquement des entiers de entier1 à entierX pourrait simplifier mon code ?

Merci d'avance
Pour le saut de caractères je viens de trouver. Ça venez du fait que je faisais :
fileobject.get(val) >> val;

Je décalais donc mon "pointeur de caractère" de deux si j'ai bien compris.
Donc le bon code est :
fileobject.get(val);

ou
fileobject >> val;


je suis pas sûr de la deuxième version.
Je pense avoir a peu prêt tout compris et ça correspond parfaitement à ce que je chercher à faire . Il est vrai que j'avais pas penser à faire de cette manière.
Je te remercie !

Dernière petite question tout de même^^:
J'ai un menu dans lequel je possède : Fichier->Quitter.
J'ai vu sur divers forums des personnes utiliser : Close(), OnOk(), Exit().

Mais dans mon application cela ne fonctionne pas. VC++ me propose uniquement CloseWindows(), ExitWindows() qui ne libérera pas la mémoire.
Pour OnOk() je me retrouve avec l'erreur suivante : Debut Assertion Failed !

Fonction Quitter :
void CTestquimarcheDlg::OnFichierQuitter() 
{
CTestquimarcheDlg dlg;
dlg.OnOK();
}


Si tu as une solution elle est la bienvenue :). Merci !
Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
122
J'ai oublié de précsier deux trois petits trucs:
- Le "fichier.close()" de ton objet "fstream" n'est pas utile. A la destruction de l'objet, le fichier est close automatiquement.
- Pas besoin de "return;" à la fin d'une fonction. "Return" sert à sortir d'une fonction prématurément. Donc si tu es déjà à la fin de celle-ci, cette instruction ne fait rien.


Dernière petite question tout de même^^:
[...] //question sur VC++


Je n'en ai aucune idée. Je ne connais pas très bien Windows (j'ai codé l'exemple précédent sous Linux :p). Ce que tu demandes n'est pas du C++, mais une question précise sur un framework de fenêtrage Windows. Sujet sur lequel je ne peux pas t'aider.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Ok merci de ces petites précisions ! Bonne journée !