Formatierung in einer Ausgabedatei mit CString
-
Zunächst vielen Dank für den Tipp, ich werde ihn gleich ausprobieren. Ich bin absoluter MFC-Neuling, und auch kein wirklich erfahrener Programmierer. Ich hatte in einem vorherigen Projekt Dateiausgaben über std::ofstreams gelöst und das jetzt einfach übernommen...
Aber ich lerne ja gerne dazu
Dass die Dateien beim ersten öffnen "gut aussehen" und durch das Speichern mit dem Editor die Zeilenumbrüche gelöscht werden finde ich verwunderlich. Gibt es dafür irgendeine Erklärung?
Und wieso tritt dieses Probem nur unter Windows XP auf?Gruß Kampmann
-
Hallo,
ich habe die Zeile gerade entsprechend geändert. Leider besteht immer noch das gleiche Problem. Wie gesagt: Wenn ich das Programm unter Windows7 ausführe, funktioniert es problemlos. Die exportierte (Text-)Datei sieht wie gewollt aus. Auch nach dem Speichern durch den Editor.
Wenn ich das gleiche unter XP mache, sieht die Datei erst auch gut aus, nach dem speichern und erneutem Öffnen durch den Editor, gehen die Zeilenumbrüche verloren.Hat noch jemand eine Idee?
-
Habe jetzt folgendes ausprobiert:
CFileDialog dlg(false); CString tmp_filename; if(dlg.DoModal()==IDOK) { tmp_filename=dlg.GetPathName(); std::ofstream datei; datei.open(tmp_filename, std::ios_base::trunc); datei<<CT2A(m_outfield.GetString()); datei.close(); tmp_filename=tmp_filename+"cstdiofile.txt"; CStdioFile datei2; datei2.Open(tmp_filename,CFile::modeCreate|CFile::modeWrite); datei2.WriteString(m_outfield.GetString()); datei2.Close(); } else { } return;
leider läuft das ganze immer noch nur unter Windows 7
Vielleicht sollte ich mein Programm als inkompatibel zu älteren Windows-Versionen veröffentlichen...Aber so schwierig kann das doch eigentlich nicht sein, nen CString in eine Datei zu bringen, wenn man unter Win7 für WinXP programmiert, oder?
-
Meines Wissens ist unter Windows die Verwendung von \r\n redundant zu \n, falls nicht im Binärmodus gearbeitet wird.
Welches Programm verwendest du, wenn du unter XP/W7 "Editor" meinst?
Ich glaube, es liegt nicht am C++-Programm, sondern an deiner nachträglichen Bearbeitung mit dem "Editor".
Schau dir doch in beiden Fällen mal im Binärmodus die Datei an, wenn an jedem Zeilenende etwas anderes als 13,10 steht, liegt es am C++-Programm sonst an den unter XP/W7 unterschiedlichen Editoreigenschaften.
-
Es ist genauso wie Wutz es scvhreibt:
Im Textmodus sollte nur mit \n gearbeitet werden. Den rest macht dann CStdioFile!Vtw: Das ist schon seit DOS Zeiten und Windows 3.0 so!
-
Ich habe \r\n genutzt, damit der Zeilenumbrauch auch in den Edit-Feldern korrekt dargestellt wird. Wenn ich die Dateien binär anschaue, steht dort 13,13,10. Kann das evtl. zu den Problemen führen?
Mit Editor meine ich den einfachen Windows-Editor (unter XP Start - Programme - Zubehör [ich glaube Systemprogramme] Editor; unter Win7 nur Editor)
Was ich noch nicht erwähnt habe ist, dass mein Win7-System auf 64bit läuft, während das XP nur 32 bit hat...
Grüße und nochmals vielen Dank für euer Engagement
Kampmann
-
Wenn Du \r\n auch in die Datei so schreiben willst dann öffne die Datei einfach im binary Modus. Dann hast Du auch keine Probleme. (CStdioFile::typeBinary)
Ob 16bit, 32bit oder 64bit sielt keine Rolle.
-
Hallo alle zusammen,
nochmals vielen Dank für eure Hilfe! Leider hat das Öffnen im binary-Modus auch nichts gebracht. Ich habe jetzt die wahrscheinlich uneleganteste Lösung des Problems gewählt:{ // TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein. CFileDialog dlg(false); CString tmp_filename; //Cstring in std::string überführen std::string output; for(int i=0; i<m_outfield.GetLength(); i++) { output=output+m_outfield[i]; } for(int i=0; i<output.length(); i++) { if(output[i]==10 && output[i-1]) { output[i]='\n'; output[i-1]=' '; } } //abspeichern if(dlg.DoModal()==IDOK) { tmp_filename=dlg.GetPathName(); std::ofstream datei; datei.open(tmp_filename, std::ios_base::trunc); datei<<output; datei.close(); } else { } return; }
Gruß
Kampmann
-
Und warum hast Du CStdioFile nbicht genommen?
Bei mir funktioniert genau solch ein Code einfach und problemlos.
-
Ich habe wieder den std::ofstream genommen, weil an einer anderen Stelle im Programm auch ofstreams verwendet werden, und ich mir da halt sicher war, wie und dass es funktioniert. Das Problem war hier halt wirklich, dass ich für die Zeilenumbrüche in den Edit-Feldern \r\n statt \n geschrieben habe. Aber das habe ich ja jetzt durch die zweite Schleife zurückersetzt.
Hätte man die Zeilenumbrüche in den Edit-Feldern denn anders hinkriegen können? Ich wollte ja einfach nur das gleiche Schriftbild auf dem Bildschirm haben wie nachher in der Datei...
Hat die CStdioFile denn irgendwelche (für mich relevanten) Vorteile gegenüber des std::ofstream?