begin process at 2012 05 29 06:49:37
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

Impossible d'écrire dans un fichier


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Impossible d'écrire dans un fichier

vendredi 27 novembre 2009 à 14:56:14 | Impossible d'écrire dans un fichier

snpier wolf

Bonjours à vous,
Je suis entrain de créer un Logeur, il fonctionne pour loguer un message dans une Message Box dans une console mais pas dans un fichier. IL créer bien le fichier, il n'indique pas d'erreur d'ouverture, mais il n'écrit rien de dans.
Avec vous une idée de pourquoi ?

bout de code :

class LogFile : public Logger
{
public:
LogFile(const std::string& FileName="Log.txt");
~LogFile(void);
private :
virtual void Write(const std::string& Msg);
std::fstream oWrite;
};

LogFile::LogFile(const std::string& FileName)
{
oWrite.open(FileName.c_str());
if(!oWrite)
MessageBox(NULL,"File not open","Angel",MB_OK);
oWrite<<"|-----------------------\tAngel"<<GetDate()<<"\t"<<GetTime()<<"\t-----------------------|\n";
}
LogFile::~LogFile(void)
{
oWrite<<"|-----------------------\tAF Corporation\t-----------------------|\n";
oWrite.close()
}
void LogFile::Write(const std::string& Message)
{
if(!oWrite.is_open())
MessageBox(NULL,NULL,NULL,MB_OK);
oWrite<<Message<<"\n";
}

si quelle qu'un a une idée ça saurait cool. merci d'avance.
vendredi 27 novembre 2009 à 17:25:09 | Re : Impossible d'écrire dans un fichier

Lucky92

Salut,

utilise std::ofstream au lieu de std::fstream et ça va devrait aller mieux.

vendredi 27 novembre 2009 à 17:29:26 | Re : Impossible d'écrire dans un fichier

snpier wolf

enfaite j'ai tout essayée ofstream fstream pas moyen, il crée le fichier mais il n'écrit pas dedans j'ai fait plain de site et sa marche chez les autre mais chez moi pas...
vendredi 27 novembre 2009 à 18:04:35 | Re : Impossible d'écrire dans un fichier

Lucky92

Voici le code de mon test si ça peut t'aider :

#pragma once

logger.h :

Code C/C++ :
#include <fstream>

class Logger 
{};

class LogFile : public Logger
{
public:
	LogFile(const std::string& FileName="Log.txt");
	~LogFile(void);
private :
	virtual void Write(const std::string& Msg);
	std::ofstream oWrite;
};


logger.cpp :

Code C/C++ :
#include "StdAfx.h"
#include "logger.h"
#include <string>

std::string GetDate() { return "15/07/1999" ; }
std::string GetTime() { return "16:52:32" ; }

LogFile::LogFile(const std::string& FileName)
{
	oWrite.open(FileName.c_str());
	if(!oWrite)
		MessageBox(NULL,"File not open","Angel",MB_OK);
	oWrite<<"|-----------------------\tAngel"<<GetDate()<<"\t"<<GetTime()<<"\t-----------------------|\n";
}
LogFile::~LogFile(void)
{
	oWrite<<"|-----------------------\tAF Corporation\t-----------------------|\n";
	oWrite.close() ;
}
void LogFile::Write(const std::string& Message)
{
	if(!oWrite.is_open())
		MessageBox(NULL,NULL,NULL,MB_OK);
	oWrite<<Message<<"\n";
} 


CTestDlg.cpp :

Code C/C++ :
void CTestDlg::OnBnClickedButton1()
{
     LogFile log; 
}


Log.txt :
|----------------------- Angel15/07/1999 16:52:32 -----------------------|
|----------------------- AF Corporation -----------------------|
vendredi 27 novembre 2009 à 18:19:08 | Re : Impossible d'écrire dans un fichier

CptPingu

Administrateur CodeS-SourceS
J'ai testé ceci, chez moi (sous Linux), et ça fonctionne parfaitement:
Peux-tu tester ce bout de code ?

Code C/C++ :
#include <iostream>
#include <fstream>

class LogFile
{
public:
  LogFile(const std::string& FileName="Log.txt");
  ~LogFile();
  virtual void Write(const std::string& Msg);

private:
  std::ofstream oWrite;
};

LogFile::LogFile(const std::string& FileName)
{
  oWrite.open(FileName.c_str());
  if(!oWrite)
    std::cerr << "File not open Angel" << std::endl;
  oWrite << "|-----------------------\tAngel\t-----------------------|\n";
}

LogFile::~LogFile()
{
  oWrite << "|-----------------------\tAF Corporation\t-----------------------|\n";
  oWrite.close();
}

void LogFile::Write(const std::string& Message)
{
  if(!oWrite.is_open())
    std::cerr << "Not open" << std::endl;
  oWrite << Message << "\n";
}

int main()
{
  LogFile log("test.txt");

  log.Write("kikoo\n");
  log.Write("kikoo2\n");

  return 0;
}
samedi 28 novembre 2009 à 02:32:45 | Re : Impossible d'écrire dans un fichier

snpier wolf

j'ai TOUT essayé sa marche pas mais j'ai trouver une parade
bon c'est pas très propre mais sa marche
.h
class LogFile : public Logger
{
public:
LogFile(const std::string& FileName="Log.txt");
~LogFile(void);
private :
virtual void Write(const std::string& Msg);

std::string nameFile,MessagePost;
};

.cpp
//File
LogFile::LogFile(const std::string& FileName): nameFile(FileName)
{

}
LogFile::~LogFile(void)
{



}
void LogFile::Write(const std::string& Message)
{


MessagePost="* msg-> ";
MessagePost+=Message;
MessagePost+='\n';
std::ofstream oWrite(nameFile.c_str());
if(!oWrite)
std::cerr << "Not open" << std::endl;
oWrite<<"|------------------------------------------------------------------|\n";
oWrite<<"| *)(Angel)(* "<<GetDate()<<"|\n";
oWrite<<"|------------------------------------------------------------------|\n\n";
oWrite<<MessagePost<<std::endl<<std::endl;
oWrite<<"|------------------------------------------------------------------|\n";
oWrite<<"|AF Corporation "<<GetTime()<<"|\n";
oWrite<<"|------------------------------------------------------------------|\n";
oWrite.close();


}
on dirait qu'il est incapable d'écrire avec une autre façon ! !
lundi 21 décembre 2009 à 02:54:26 | Re : Impossible d'écrire dans un fichier

snpier wolf

Re
j'ai trouvé pourquoi ça ne marche pas, mais je n' arrive pas à résoudre le problèmme.

Enfaite j'ai omi un détaile importent, le gestionnaire passe par une autre class static.
voila comment ça ce présent :
LoggerManager.h
Code C/C++ :
class LoggerManager
{
static LoggerManager P_log;
virtual write(const char*);
  public:
   static void SetLog(LoggerManager* NewLog);
   static void Log(const char*); 
   static void Destroy();
};


LoggerManager.cpp
Code C/C++ :
LoggerManager* LoggerManager:: P_log = NULL;
void LoggerManager::SetLog(LoggerManager* NewLog)
{
    Destroy();
    P_log=NewLog;
}
void LoggerManager::Log(const char* LOG)
{
      if(!P_log)return;
      P_log->write(LOG);
}
void LoggerManager::Destroy()
{
   delete P_log;
   sizerof(P_log);
}

enfin dans le logfile
Code C/C++ :
class LogFile
{ 
  FILE*m_File;
  void write(const char* texte)
  {
     fputs(texte,m_File);
  }
  public:
    LogFile(const char* Fname)
    {
        fopen(Fname,"w");
        fputs("---------------------*)(ANGEL)(*-------------------\n",m_File);
      }
     ~LogFile()
      {
         fputs("---------------------------------------------------",m_File);
         fclose(m_File);
       }
};
     


utilisation :

LoggerManager::SetLog(new LogFile("log.log"));
LoggerManager::Log("Teste\n");

dans le fichier log.log :
-----------------------------*)(ANGEL)(*-------------------------
Teste

mais il n'y a pas la ligne : --------------------------------------------------------.
On dirait que le déstructeur n'ait jamais appelé.
De plus si on met la ligne "LoggerManager::SetLog(new LogFile("log.log"));" dans une boucle ça génère une fuite mêmoire.
voila ma question : avez - vous une idée de pour quoi le destructeur n'est il jamais appelé ?
lundi 21 décembre 2009 à 10:14:42 | Re : Impossible d'écrire dans un fichier

CptPingu

Administrateur CodeS-SourceS
Ca ressemble à un singleton, mais en moins bien.

vous une idée de pour quoi le destructeur n'est il jamais appelé ?


Je ne vois pas de destructeur dans ta classe LoggerManager. Tu ne detruit jamais la classe Log, donc la destructeur n'est jamais appelé.


delete P_log;
sizerof(P_log);


Hein ? Pourquoi "sizerof" ?

A ta place je transformerais ton logger en singleton, et j'ajouterais des méthodes pour: ouvrir le flux, écrire et fermer le flux. Le destructeur ne devrait pas fermer le flux. C'est une méthode à part entière qui devrait le faire.


Singleton.hh
Code C/C++ :
#ifndef SINGLETON_HH_
# define SINGLETON_HH_

template<typename T>
class Singleton
{
protected:
 Singleton();
 virtual ~Singleton();

public:
 static T&     getInstance();
};

# include "Singleton.hxx"

#endif /* !SINGLETON_HH_ */


Singleton.hxx
Code C/C++ :
/*!
** Construct the singleton.
*/
template<typename T>
Singleton<T>::Singleton()
{

}

/*!
** Destruct the singleton.
*/
template<typename T>
Singleton<T>::~Singleton()
{
}

/*!
** Get the instance of the singleton.
**
** @return Instance of the object
*/
template<typename T>
T&
Singleton<T>::getInstance()
{
 static T object;
 return object;
}


LogFile.hh

Code C/C++ :
 class LogFile : public Singleton<LogFile>
 {
   friend class Singleton<LogFile>; // Simplifie l'appel

 private:
   LogFile();
   ~LogFile();
   std::ofstream m_File;
public:
   void open(const char* texte);
   void write();
   void close();
 };


Appel
Code C/C++ :

void function()
{
  LogFile& log = LogFile::getInstance();
  log.write("Youpi");
}

int main()
{
  LogFile& log = LogFile::getInstance();
  log.open("file.txt"); // Dans le début du main par exemple
  log.write("Kikoo");
  function()
  log.close(); // A la fin du main par exemple.
}


Ecrira:


Youpi
Kikoo

lundi 21 décembre 2009 à 10:16:31 | Re : Impossible d'écrire dans un fichier

CptPingu

Administrateur CodeS-SourceS

Je ne vois pas de destructeur dans ta classe LoggerManager. Tu ne detruit jamais la classe Log, donc la destructeur n'est jamais appelé.



Au temps pour moi, je n'avais pas vu le constructeur.
dimanche 27 décembre 2009 à 23:58:48 | Re : Impossible d'écrire dans un fichier

snpier wolf

ton idée de la randre singleton est bien mais ne convien pas a l'idée.
j'éxplique la class LoggerManager peux appeller une autre class que LogFile ex : LogMsgBox
Code C/C++ :
class LogMsgBox
{ 
 
  void write(const char* texte)
  {
     MessageBox(NULL,texte,"-)(ANGEL)(-",MB_OK);
  }
  
};

et Op on appelle la class avec LoggerManager :
LoggerManager::SetLog(new LogMsgBox);
LoggerManager::Log("Teste\n");
et la sous windows une fenetre msgBox ouvre avec écri Teste de dans.
LoggerManager serre justement à utiliser LoggerManager::Log(), et suivent l'initialisation, c'est dans une console, un fichier, une msgbox etc...


1 2

Cette discussion est classée dans : fichier, message, std, logfile, owrite


Répondre à ce message

Sujets en rapport avec ce message

Matez ça! :) [ par MaDC ] J'ai un soucis avec mon appli MFC.Je voudrais ouvrir un document avec ça :void CCommandeRobotView::OnFileOpen() { CFileDialog fenetreDlg( true, NU [C] Transfert de fichier par sockets [ par bonobo78 ] salut ! j'ai un petit pb pour transmettre un fichier via des sockets.En fait, je decoupe le fichier en petit bout de 1024 octets et je transmets chaqu spliter un fichier.... [ par damdam04 ] salut le monde des programmeursj'ai deja posté un message sur le forum de VB sur le splitage de fichier... "je cherche comment décomposer des lignes, remplissage d'un std::list [ par boun85 ] Voila mon probleme est assez simple je pense mais je n'arrive pas a le resoudre. Voila j'ai une fonction qui lit un fichier et qui rempli une std::lis problème de fermeture de fichier [ par RubikEID ] Salut à tous.Après pas mal de recherche je n'ai pas à réussi à trouver de réponse.je suis confronter au problème suivant : je veux effectue la recherc comment distinguer entre fichier et repértoire! [ par almousafer ] salut tlm Je viens d'ecrire une fonction qui parcours le répertoire passé en argument et liste son contenu (merci à Fred), mais il reste encore un pb, modifier la ligne N [ par Rhazou ] bonjour, J'ai un petit probleme concernant les flux entré/sortie. j'aimerais replacer un ligne par une autre dasn un fichier. je cherche depusi un mom surcharge delete [ par koala01 ] Salut, Je m'adresse à vous car je suis confronté à un problème qui me  fait perdre mon latin... Je souhaites créer un "gestionnaire de mémoire" dans l message d'erreur [ par mqsi ] bjr a tous;j'ai un petit probleme : j'ai un programme qui lire un fichier text ligne par ligne quand le fichier contient plusieur ligne( equivalent  3 Ofstream Global [ par vba_blitz ] Bonjourj'ai une variable globale std::ofstream fichier;et je souhaite donner un chemin à fichier. D'habitude je fais ofstream fichier("G:/...."), mais


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,686 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales