Einlesen von Koordinatenliten mit CArchive, Umwandlung CString in double und zurück
-
Hallo Leutz,
ich habe einige Fragen bei der Benutzung der MFC-Klassen. Ich möchte ein kleines Programm (Dialog-basiert) schreiben, mit dessen Hilfe ich Punktkoordinaten X,Y,Z aus einer Textdatei lesen, anzeigen, bearbeiten und verschiedene mathematische Operationen (Drehung, Ausschneiden von Daten aus einem Rechteck…) ausführen kann. I
Bei der bisherigen Version treten jede Menge Probleme auf, die ich nicht lösen kann.1. Mit Hilfe der CArchive_Klasse lese ich die in der Textdatei enthaltenen 3-D-Koordinaten mit dem Befehl Readstring ein und füge Sie der CString-Membervariable eines Anzeigefensters hinzu. Dann lasse ich mir das ganze in Control-Edit-Feld anzeigen. Leider werden die Returnzeichen als Rechteckzeichen angezeigt, die Koordinatenvektoren sind also in einer Zeile angeordnet. Sie sollen aber jeweils als ein Vektor nebeneinander stehen und dann soll ein Return kommen. Füge ich dem CString nach jedem Vektor ein „\n“ hinzu, erfolgt kein Umbruch im Fenster während „\t“ jedoch den Tabsprung auslöst. Wie kann ich dafür sorgen, dass nach einem Vektor, der nächste direkt darunter angezeigt wird?
2. Nachdem ich die Koordinaten im Edit-Feld anzeigen lasse, sind die Buttons für die Bearbeitung (z.B. Drehung etc) freigeschaltet. Nachdem ich solch einen Button drücke, sollen die Koordinaten von der Datei eingelesen werden. Diesmal aber als double-Werte. Ich benutze wieder CFile und CArchive. Hier die Codestellen
//Deklaration und Initialisierung der Variable für die einzulesende Datei
CFile Datei_Koordinaten(m_Str_Pfadname_Eingangsdatei,CFile::modeRead);//Deklaration und Initialisierung der CArchive-variable für das gebufferte Einlesen
CArchive Koordinaten(&Datei_Koordinaten,CArchive::load);for (int Counter = 0; Counter < m_Int_Anzahl_Koordinatensaetze-1; Counter++)
{
Koordinaten >> x; Koordinaten >> y; Koordinaten >> z;
….
}Leider bekomme ich irgendwelche Zahlen (i.d.R. sehr groß), aber nicht die in der Datei enthaltenen Zahlen. Gleiches passiert, wenn ich sie als int einlese. Nur wenn ich x,y,z als char deklariere, bekomme ich jeweils die richtige Zahl. Wie kann ich die Koordinaten mit MFC einlesen (Benutze ich die Klasse „ifstream“ aus fstream.h habe ich keine Probleme!)?
3. Wie begrenze ich das Auslesen von Daten. Beim zeilenweisen Einlesen der Punkte mit ReadString der Klasse CArchive bekomme ich als Returnwert ja eine Aussage, ob ich das Dateiende erreicht habe. Nutze ich aber den überladenen Operator >> der CArchiveklasse zum Einlesen, bekomme ich keine Aussage. Deshalb wollte ich die Funktion GetPosition der CFileklasse nutzen. Davor habe ich mit GetLength die Byteanzahl des Files bestimmt. Nach dem falschen Einlesen des ersten double-Wertes gibt mir GetPosition an, dass er am Ende des Files ist. Was läuft da falsch?
4. Da ich realisieren möchte, dass die verarbeiteten double-Werte auch im Edit-Fenster angezeigt werden, muss ich die double-Werte in CStrings umwandeln. Auch der umgekehrte Übergang von CString zu double ist für mich wichtig, da der Bearbeiter im Fenster die Koordinaten ändern können soll. Anschließend könnte dann eine Verarbeitung z.B. Drehung erfolgen. Dazu müssten die CString-Werte in double-Werte umgewandelt werden. Welche Möglichkeiten habe ich?
5. Was hat es mit der Funktion „Double.ToString-Methode“ auf sich. Kann ich diese Funktion in einer ganz normalen MFC-Anwendung zur Transformation von Double in CString nutzen (Bei mir klappt es nicht. Ich bekomme folgende Fehlermeldung: d:\Brzank\CPlusPlus\Koordinaten_2\KoordinatenDlg.cpp(349): error C2653: 'System': Keine Klasse oder Namespace! Die entsprechende Codezeile sieht folgendermaßen aus:
&Wert_x = System::Convert::ToString(x);
Danke für Eure Hilfe!

-
1.) Du kannst in einem Dialog double-Members mit einem CEdit verknüpfen, die Umwandlung geschieht implizit. Welche IDE benutzt du?
2.) Was spricht den dagegen ifstream zu benutzen wenn es doch funktioniert? Mit CArchive müsste es auch gehen, dann musst du die Daten aber auch vorher mit einem CArchive heraus schreiben.
3.) Double.ToString sieht mir nach Java aus (oder das C#-Pendant). Wie man Strings und verschiedene Datentypen ineinander umwandelt steht ausführlch in den C++-FAQ.
-
zu 1) Was versteckt sich denn hinter IDE?

zu 2) Ich will komplett mit MFC arbeiten und wenn möglich nicht mit berwährten Methoden mischen. Schließlich will ich ja ein Gefühl für MFC bekommen.
zu 3) Dann schau ich doch gleich mal in die FAQ! Danke