Stringproblem

javaprogger1987

Erfahrenes Mitglied
Also ich hab ein Problem und blick da nicht so ganz durch...

Code:
  //Dateinamen generieren
  std::ostringstream os;
  os << (newtime->tm_year+1900);
  os << "_";
  os << (newtime->tm_mon+1);
  os << "_";
  os << (newtime->tm_mday);
  os << "-";
  os << (newtime->tm_hour);
  os << "_";
  os << (newtime->tm_min);
  os << ".log";
 
  //Ausgabe
  cout << os.str() << endl; //Ergibt z.b. 2005_07_27-15_17.log
 
  const char* logFile = os.str().c_str();
  MessageBox(NULL, logFile, "", 0); //Ergibt totalen Müll z.B. "¼^’"
 
  hLogFile = CreateFile( logFile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, 0, NULL ); //Dateiname enspricht der Ausgabe von MessageBox

Nun möchte ich einfach nur eine Datei die den Namen des Datums und der Uhrzeit hat.. nur weiß ich nicht waurm da so ein Müll bei rauskommt.. oder geht das viel einfacher

Danke schonmal (P.s. ich bin ein totaler C++ Newbie, bin von Java andere Sachen gewöhnt...)
 
Hi.

Also ich hab das gerade mal ausprobiert und ich kann das hier nicht reproduzieren. Bei mir kommt 2mal der gleiche String heraus.

Was benutzt du denn für einen Compiler/C++ Standard-Bibliothek?

Probier doch mal den String nur einmal abzufragen:
Code:
string str = os.str( );

cout << str; 

const char* logFile = str.c_str ();

(nicht das das einen Unterschied machen sollte, aber was anderes fällt mir nicht ein)
 
Ich benutze Borlands C++ Builder X mit dem Borland Compiler... Geht aber jetzt mit der Version von dir auch.. Sehr merkwürdig.. Danke
 
moin


Folgendes führt auch zur richtigen Ergebnis:
Code:
char *logFile = new char [20];
strcpy(logFile, os.str().c_str());


mfg
umbrasaxum
 
javaprogger1987 hat gesagt.:
Ich benutze Borlands C++ Builder X mit dem Borland Compiler... Geht aber jetzt mit der Version von dir auch.. Sehr merkwürdig.. Danke

Also dann nehme ich an, das wenn man bei deinem Compiler den internen String des ostringstream mit dessen str() Methode einmal abgefragt hat, das der ostringstream dann sozusagen ungültig wird und man erst wieder etwas hineinschreiben muß um ein vernünftiges Ergebnis zu kriegen.

Du kannst es ja mal spaßeshalber ausprobieren:
Code:
cout << os.str() << endl << os.str() << endl;
Müßte eigentlich 2mal das gleiche herauskommen.
 
moin


Warum sollte das der Fall sein das es bei seinem Compiler bzw. dem von ihm verwendeten anders ist?!

MSDN hat gesagt.:
basic_ostringstream::strSee Also
basic_ostringstream Class | basic_ostringstream Members
Sets or gets the text in a string buffer without changing the write position.

basic_string<Elem, Tr, Alloc> str( ) const;
void str(
basic_string<Elem, Tr, Alloc>& _Newstr
);
Parameter
_Newstr
The new string.
Return Value
Returns an object of class basic_string<Elem, Tr, Alloc>, whose controlled sequence is a copy of the sequence controlled by *this.

Remarks
The first member function returns rdbuf -> str. The second member function calls rdbuf -> str(_Newstr).

Das Problem in seinem Code ist das kopieren des Inhalts in den const char *.


mfg
umbrasaxum
 
Ja, du hast Recht. Anscheinend ist sein Compiler lediglich zu fix beim Aufräumen und hat den temp. String von os.str() schon wieder freigegeben bevor MessageBox aufgerufen wurde und damit ist der Pointer zum C-String des Objekts logischerweise auch nicht mehr gültig.

Ach, Zeit für'ne Pause. :-(
 
Vielen Dank für die vielen Antworten.. da krieg ich jetzt schon solche Probleme, dabei wollte ich doch nur das Datum abfragen und eine Datei damit erzeugen ;)...
 
moin


Ja, das war auch weniger an dich gerichtet ;)
Aber du hast ja jetzt ein paar Lösungsvorschlage.


mfg
umbrasaxum
 
Zurück