Efstream, impossibilité d'écrire dans un fichier .txt [Résolu]

LaGrandeBete06 6 Messages postés lundi 20 juin 2011Date d'inscription 22 juin 2011 Dernière intervention - 20 juin 2011 à 18:31 - Dernière réponse : LaGrandeBete06 6 Messages postés lundi 20 juin 2011Date d'inscription 22 juin 2011 Dernière intervention
- 22 juin 2011 à 11:03
Bonjour à tous,

Je viens de me mettre au C++ et je dois créer et ouvrir un fichier .txt avec une methode, puis j'appelle une autre methode pour écrire dans ce fichier des résultats. Le fichier se créé bien mais je n'arrive pas à écrire dedans, en effet une fois terminé je l'ouvre manuellement et il est vide (taille O ko).
Pourriez vous me filer un coup de main, je galère un peu....
Voici ma première methode:

void PricingWaveKernel::Write_txt::InitializeSim(unsigned long simulationKey, unsigned long MCIterations)
{
char simulationKeyChar[sizeof(unsigned long)];
sprintf(simulationKeyChar,"%d",simulationKey);
char fileName[10000];
strcpy(fileName,this->GetParameters()->cparptr[0]);
strcat(fileName,simulationKeyChar);
strcat(fileName,".txt");
ofstream outfile;
outfile.open(fileName,ios::out);

}

et la seconde

void PricingWaveKernel::Write_txt::SimulateSim(unsigned long simulationKey, unsigned long MCIterations, unsigned long time)
{

if(outfile.bad()) // si l'ouverture a réussi
{
double a = *this->parameters->inptr[0];
std::string s;
std::ostringstream oss;
oss << a;
s = oss.str();
outfile<<s;

}

}

J'ai voulu tous mettre sous la forme de string dans la seconde.... le a affiche bien mon input. et les methodes sont bien appelée les unes à la suite des autres et tout compile bien... J'ai pas mal chercher sur le net, le truc c'est que j'ouvre et j'écris avec deux mathodes différentes donc je pense que ca vient de ça.

Je vous remercie pour votre aide.

LaGrandeBete
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscription 6 octobre 2018 Dernière intervention - 22 juin 2011 à 10:26
1
Merci
Si ton but est d'écrire dans le même fichier, à la suite, en utilisant ta classe comme classe d'écriture, alors il ne faut pas crééer de std::ofstream en local. Met le en attribut de ta classe.

Dans ton header, tu indiques un:
private:
  std::ofstream   _outfile;


Dans "PricingWaveKernel::Write_txt::Write_txt(void)"
_outfile.open(buff.str().c_str());
if (!_outfile)
{
  // Erreur d'ouverture du fichier
  return;
} 


Dans "void PricingWaveKernel::Write_txt::SimulateSim(unsigned long simulationKey, unsigned long MCIterations, unsigned long time)"
  _outfile << *this->parameters->inptr[0] << std::endl;


Dans "void PricingWaveKernel::Write_txt::FinalizeSim(unsigned long simulationKey, unsigned long MCIterations)"
_outfile.close();


________________________________________________________________________
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

Merci cptpingu 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de cptpingu
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscription 6 octobre 2018 Dernière intervention - 20 juin 2011 à 20:50
0
Merci

void PricingWaveKernel::Write_txt::InitializeSim(unsigned long simulationKey, unsigned long MCIterations)
{
char simulationKeyChar[sizeof(unsigned long)];
sprintf(simulationKeyChar,"%d",simulationKey);
char fileName[10000];
strcpy(fileName,this->GetParameters()->cparptr[0]);
strcat(fileName,simulationKeyChar);
strcat(fileName,".txt");
ofstream outfile;
outfile.open(fileName,ios::out);
// outfile << simulationKeyChar; ???
}


Tu ouvres bien le fichier, mais tu n'écris pas dedans, non ?

Quelques remarques:
- Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- Ne mélange pas C et C++. Si tu fais du C++, essaie de t'y tenir au maximum.

J'aurais écrit ta fonction comme ceci:

void PricingWaveKernel::Write_txt::InitializeSim(unsigned long simulationKey, unsigned long MCIterations)
{
  std::ostringstream buff;
  buff << this->GetParameters()->cparptr[0] << simulationKey << ".txt";
  std::ofstream outfile(buff.str().c_str());
  if (!outfile)
  {
    // Erreur d'ouverture du fichier
    return;
  }
  outfile << // Valeur ?
  // outfile << MCIterations; ?
  outfile.close(); // Facultatif, un ofstream se ferme automatiquement à la fin d'un scope :)
}



________________________________________________________________________
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
Commenter la réponse de cptpingu
LaGrandeBete06 6 Messages postés lundi 20 juin 2011Date d'inscription 22 juin 2011 Dernière intervention - 20 juin 2011 à 21:47
0
Merci
Merci beaucoup pour ton aide, j'avoue que je debute un peu...
Je voudrai juste savoir si il est possible d'ecrire dans le fichier avec une autre procedure que j'appelle de facon iterative en fonction du nombre de resultats que j'ai calculé du type:


void PricingWaveKernel::Write_txt::SimulateSim(unsigned long simulationKey, unsigned long MCIterations, unsigned long time)
outfile.open();
if (!outfile)
{
// Erreur d'ouverture du fichier
return;
}
// outfile << Valeur
outfile.close(); //
}
Je me doute que je vais avoir un problème pour écrire a la suite dans le fichier texte sans effacer ce qu'il y a avant. mais je ne sais pas trop comment gérer ca.

Je ne peux tester que demain le programme mais en tous cas merci encore pour ton temps.

LaGrandeBete
Commenter la réponse de LaGrandeBete06
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscription 6 octobre 2018 Dernière intervention - 20 juin 2011 à 21:58
0
Merci
Je me doute que je vais avoir un problème pour écrire a la suite dans le fichier texte sans effacer ce qu'il y a avant

Non aucun problème.
outfile << "toto";
suivi de:
outfile << "tutu";
Mettra bien "tototutu" dans le fichier.

Je voudrai juste savoir si il est possible d'ecrire dans le fichier avec une autre procedure que j'appelle de facon iterative en fonction du nombre de resultats que j'ai calculé du type:

Je n'ai pas encore compris le but de la manœuvre, mais c'est techniquement tout à fait possible (et pas difficile).

________________________________________________________________________
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
Commenter la réponse de cptpingu
LaGrandeBete06 6 Messages postés lundi 20 juin 2011Date d'inscription 22 juin 2011 Dernière intervention - 21 juin 2011 à 16:35
0
Merci
Merci encore pour ta reponse,
La première partie de ton code marche très bien mais ensuite lorsque j'appelle ma methode de façon itérative pour écrire dans le fichier une fois créé, je n'arrive toujours pas à écrire dans le fichier.
le test if (outfile!) me revoie toujours à l'exception comme quoi mon fichier n'est pas ouvert. Je ne comprends pas pourquoi la methode open() ne marche pas.

Voici la méthode que j'utilise:

void PricingWaveKernel::Write_txt::SimulateSim(unsigned long simulationKey, unsigned long MCIterations, unsigned long time)
{
double a = *this->parameters->inptr[0];
std::string s;
std::ostringstream oss;
oss << a;
s = oss.str();

outfile.open(buff.str().c_str(),ios_base::out );


if (!outfile)// Ca bloque ici à chaque fois!!!!!!
{
// Erreur d'ouverture du fichier
return;
}
outfile << s << endl;

}

Merci de ton aide.
LaGrandeBete
Commenter la réponse de LaGrandeBete06
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscription 6 octobre 2018 Dernière intervention - 21 juin 2011 à 16:43
0
Merci
outfile.open(buff.str().c_str(),ios_base::out );

1) Pas besoin de faire un open. Le constructeur de ofstream fait déjà un open.
2) Pas besoin de std::ios_base::out, un ofstream c'est un fstream + std::ios_base::out

Je ne comprends pas pourquoi la methode open() ne marche pas.

Il ne trouve pas ton fichier, tout simplement. Vérifie le dossier d'exécution ou indique un chemin absolu.

std::string s;
std::ostringstream oss;
oss << a;
s = oss.str();
outfile << s << endl;

Y a un souci là. Pourquoi passer par un std::ostringstream, puis le mettre dans un string pour le remettre dans un fstream ?
Autant mettre directement dans le fstream (qui est un ostringstream pour fichier).
//std::string s;
//std::ostringstream oss;
//oss << a;
//s = oss.str();
outfile << a << std::endl;


PS: Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace

________________________________________________________________________
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
Commenter la réponse de cptpingu
LaGrandeBete06 6 Messages postés lundi 20 juin 2011Date d'inscription 22 juin 2011 Dernière intervention - 21 juin 2011 à 17:44
0
Merci
"Il ne trouve pas ton fichier, tout simplement. Vérifie le dossier d'exécution ou indique un chemin absolu. "

comment je peux faire ca?
En fait je construit un fichier par simulation dans lequel je mets mes resultats. Tout va bien pour la création mais pour le reste ça ne m'écrit rien parce qu'entre deux méthodes le fichier se ferme ou se bloque.
Je ne peux pas indiquer un chemin absolu parce que mon chemin change.
Initialement ce code créait des fichier binaires mais je voudrais le changer pour créer des fichier.txt (plus facile d'utilisation sous excel)et ensuite des fichier csv (mais bon ça c'est le next step étant donné que je galère vachement sur le .txt déjà)
bon je ne sais pas si tu vas pouvoir m'aider, mais merci de ton temps et bonne fete de la musique!!!!!!

LaGrandeBete
Commenter la réponse de LaGrandeBete06
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscription 6 octobre 2018 Dernière intervention - 21 juin 2011 à 17:52
0
Merci
Je ne peux pas indiquer un chemin absolu parce que mon chemin change.

Aucun rapport. Un chemin absolu, contrairement à un chemin relatif, veut juste dire que tu indiques le chemin complet. Rien ne t'empêche d'avoir une partie variable.

m'écrit rien parce qu'entre deux méthodes le fichier se ferme ou se bloque.

Tu ne m'as toujours pas donné les informations suivantes qui me permettraient de vraiment t'aider:
- Que cherches-tu à faire ?
- Que fais ta classe ? Comment tu t'y prends ?

Je soupçonne une grosse erreur de conception. (Quand je vois ça: *this->parameters->inptr[0], ça me fait un peu peur).

________________________________________________________________________
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
Commenter la réponse de cptpingu
LaGrandeBete06 6 Messages postés lundi 20 juin 2011Date d'inscription 22 juin 2011 Dernière intervention - 22 juin 2011 à 10:19
0
Merci
Merci pour ton aide
Ma classe représente un bloc qui fait les chose suivante:
- Elle récupère des données en input qui proviennent de simulations de Monte Carlo.
- Ces données sont chargées
- Puis je créé (veut créer) un fichier txt pour les afficher, (initialement le code créer un fichier de sortie en format binaire, mais je veut créer une nouvelle classe pour créer un fichier de sortie en format txt).
- J'écris une à une les données dans le fichier txt,
- Je réalise cette opération (création + écriture autant de fois qu'il y a de simulation de Monte Carlo)

voici ma classe:

#include "PricingWaveStdLib.h"
#include
#include <fstream>
#include <sstream>


using namespace std;

PricingWaveKernel::Write_txt::Write_txt(void)
{
this->ResetParameters();
this->initialParameters = new PricingWaveKernel::BlockParameters(*this->parameters);
}
void PricingWaveKernel::Write_txt::InitializeSim(unsigned long simulationKey, unsigned long MCIterations)
{
std::ostringstream buff;
buff << this->GetParameters()->cparptr[0] << simulationKey << ".txt";
std::ofstream outfile(buff.str().c_str());
if (!outfile)
{
// Erreur d'ouverture du fichier
return;
}

}
void PricingWaveKernel::Write_txt::SimulateSim(unsigned long simulationKey, unsigned long MCIterations, unsigned long time)
{

// ecriture des résultats des simulations
double a = *this->parameters->inptr[0];
outfile << a << std::endl;

}

void PricingWaveKernel::Write_txt::FinalizeSim(unsigned long simulationKey, unsigned long MCIterations)
{
outfile.close();
}
void PricingWaveKernel::Write_txt::UpdateParameters(void)
{
}
void PricingWaveKernel::Write_txt::ResetParameters(void)
{
this->SetParameters(this->GetInitialParameters());
this->FinalizeParametersUpdate();
}
PricingWaveKernel::BlockParameters* PricingWaveKernel::Write_txt::GetInitialParameters(void) const
{
int i1[1] a= {-1};
char** inLabel = new char*[1];
inLabel[0] = "S";
int ncpar = 1;
int cparsz[1] = {1};
int cparsz2[1] = {1};
char** cparLabel = new char*[16];
cparLabel[0] = "Output Directory";
return new PricingWaveKernel::BlockParameters(0,1,i1,i1,inLabel,0,0,0,NULL,0,0,0,NULL,0,0,0,NULL,ncpar,cparsz,cparsz2,cparLabel);

}

Merci Pour ton temps CptPingu

LaGrandeBete
Commenter la réponse de LaGrandeBete06
LaGrandeBete06 6 Messages postés lundi 20 juin 2011Date d'inscription 22 juin 2011 Dernière intervention - 22 juin 2011 à 11:03
0
Merci
Merci Beaucoup, je comprends mieux pourquoi ça ne marchait pas.
Tout roule.
Bonne journée a toi et merci encore.

LaGrandeBete
Commenter la réponse de LaGrandeBete06

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.