fstream schreibt die variabeln nicht richtig
-
moin.
ich habe mehrere eingabefelder, diese eingaben werden jeweils in einem cstring gespeichert.
und diese variabelninhalte sollen in eine datei beschrieben werden.bei meinem kleinen testprogramm zuvor klappte es und nun benutze ich fast den gleichen code und es geht nicht bzw. er schreibt mir den variabelninhalt in hexerdezimal oder in einem anderen komischen code.
hier mein quelltext-ausschnitt:
CEdit* e_Montag = (CEdit*)GetDlgItem(IDC_EDIT1); CEdit* e_Dienstag = (CEdit*)GetDlgItem(IDC_EDIT2); CEdit* e_Mittwoch = (CEdit*)GetDlgItem(IDC_EDIT3); CEdit* e_Donnerstag = (CEdit*)GetDlgItem(IDC_EDIT4); CEdit* e_Freitag = (CEdit*)GetDlgItem(IDC_EDIT5); CString s_Montag, s_Dienstag, s_Mittwoch, s_Donnerstag, s_Freitag; e_Montag->GetWindowText(s_Montag); e_Dienstag->GetWindowText(s_Dienstag); e_Mittwoch->GetWindowText(s_Mittwoch); e_Donnerstag->GetWindowText(s_Donnerstag); e_Freitag->GetWindowText(s_Freitag); if (m_SelectSaveas == 0) { MessageBox(L"Es wurde keine Speicheroption ausgewählt", L"Error!", 0); } if (m_SelectSaveas == 1) { fstream f; //öffnen o. erstellen die .txt datei und schreiben den entsprechenden Inhalt rein f.open("./currentweek.txt", ios::app); f << "Montag:"<< endl; f << s_Montag << endl; f << "Dienstag:" << endl; f << s_Dienstag << endl; f << "Mittwoch:" << endl; f << s_Mittwoch << endl; f << "Donnerstag:" << endl; f << s_Donnerstag << endl; f << "Freitag:" << endl; f << s_Freitag << endl; f.close();Das Ergebnis in der .txt Datei sieht denn immmer so aus:
Montag:
00DA1C58
Dienstag:
00DA1CB0
Mittwoch:
00DA1D08
Donnerstag:
00DA1D60
Freitag:
00DA1DC0Wenn ich aber nen Breakpoint setze und schaue, was für ein Variabelninhalt die haben, zeigt er mir nach wie vor die ganz normalen Inhalt an.
Wenn ich irgendeine Variabel nehme und die verwende nimmt er auch den gleichen Inhalt. (Hab da das z.b. gemacht: SetDlgItemText(IDC_EDIT2, s_Freitag..... das geht auch wunderbar)Außer beim Hineinschreiben in die .txt Datei schreibt er nicht den normalen Inhalt rein

-
Da der Stream-Operator << anscheinend nicht für den Datentyp CString definiert wurde, wird nur die Adresse des Objektes ausgegeben.
Verwende daher:
f << s_Montag.c_str() << endl;Das Problem sind die unterschiedlichen Frameworks, d.h. die MFC-Klassen sind nicht kompatibel zu den Standard C++ Klassen (wie z.B. std::string).
Alternativ könntest du auch in MFC die CFile-Klasse benutzen...
-
Th69 schrieb:
Da der Stream-Operator << anscheinend nicht für den Datentyp CString definiert wurde, wird nur die Adresse des Objektes ausgegeben.
Verwende daher:
f << s_Montag.c_str() << endl;Das Problem sind die unterschiedlichen Frameworks, d.h. die MFC-Klassen sind nicht kompatibel zu den Standard C++ Klassen (wie z.B. std::string).
Alternativ könntest du auch in MFC die CFile-Klasse benutzen...Error 1 error C2039: 'c_str' : is not a member of 'ATL::CStringT<BaseType,StringTraits>'
Komische ist ja, dass es zuvor unter den gleichen Umständen in einem anderen Beispiel ging

-
ichnochmalhier schrieb:
Komische ist ja, dass es zuvor unter den gleichen Umständen in einem anderen Beispiel ging

Dann hast du vielleicht Glück gehabt. Wie schon gesagt wurde, wenn die CStrings und std::ostreams nicht kompatibel sind, musst du sie entweder kompatibel machen (op<< für CString überladen oder eine konverterfunktion von CString in ein geeignetes Proxobjekt schreiben oder was auch immer) oder dich auf eine der beiden Bibliotheken beschränken (std::ostream mit std::string, oder CFile mit CString)
-
pumuckl schrieb:
ichnochmalhier schrieb:
Komische ist ja, dass es zuvor unter den gleichen Umständen in einem anderen Beispiel ging

Dann hast du vielleicht Glück gehabt. Wie schon gesagt wurde, wenn die CStrings und std::ostreams nicht kompatibel sind, musst du sie entweder kompatibel machen (op<< für CString überladen oder eine konverterfunktion von CString in ein geeignetes Proxobjekt schreiben oder was auch immer) oder dich auf eine der beiden Bibliotheken beschränken (std::ostream mit std::string, oder CFile mit CString)
Das finde ich aber seltsam. Hab kaum was an meinem Beispiel geändert. Habe nur den Dialog ein wenig geändert aber der fstreamcode ist so gut wie gleich geblieben.
Ok dann hier meine Frage: Ich hab hier meine Auswertung der Eingaben:
CEdit* e_Montag = (CEdit*)GetDlgItem(IDC_EDIT1); CEdit* e_Dienstag = (CEdit*)GetDlgItem(IDC_EDIT2); CEdit* e_Mittwoch = (CEdit*)GetDlgItem(IDC_EDIT3); CEdit* e_Donnerstag = (CEdit*)GetDlgItem(IDC_EDIT4); CEdit* e_Freitag = (CEdit*)GetDlgItem(IDC_EDIT5); CString s_Montag, s_Dienstag, s_Mittwoch, s_Donnerstag, s_Freitag; e_Montag->GetWindowText(s_Montag); e_Dienstag->GetWindowText(s_Dienstag); e_Mittwoch->GetWindowText(s_Mittwoch); e_Donnerstag->GetWindowText(s_Donnerstag); e_Freitag->GetWindowText(s_Freitag);Und wie schreibe ich diese Eingaben nun in eine (.txt) Datei? Mit fstream geht es ja anscheinend nicht.
-
Sorry, die Methode "c_str()" gibt es nicht bei CString, sondern den Konvertierungsoperator (const char *), d.h.:
f << (const char *)s_Montag << endl;
-
ichwieder.. schrieb:
...Hab kaum was an meinem Beispiel geändert. Habe nur den Dialog ein wenig geändert ...
Das ist praktisch, weil es die Fehlersuche eingrenzt...
Gruß,
Simon2.
-
Hast Du vielleicht was an den Includes geändert? Vielleicht bietet die ATL ja doch einen passenden Overload für operator<< an, aber der ist in einem Include-File enthalten, welches jetzt fehlt.