mathemanu Geschrieben 20. Juli 2010 Geschrieben 20. Juli 2010 Guten Morgen. Ich habe letzte Woche ein Praktikum begonnen und eine Programmieraufgabe aufs Auge gedrückt bekommen. Jetzt suche ich seit drei Stunden im Internet nach einer Lösung für folgendes Problem: Ich muss eine txt-Datei mit Zahlenwerten auslesen und Kommazahlen in Punktzahlen verwandeln um damit dann in C++ weiterarbeiten zu können. Das ist kein Problem und ich habe auch schon viele Codes dafür gesehen. Unter anderem auch diesen hier: int main(void) { ifstream in("LissajouDaten1.txt"); copy(istreambuf_iterator<char>(in), istreambuf_iterator<char>(), ostreambuf_iterator<char>(cout) ); cin.get(); return EXIT_SUCCESS; } Der ließt mir zwar meine Datei aus, ich kann ihn jedoch nicht dazu bewegen mir meine ausgelesenen Kommazahlen in Punktzahlen zu verwandeln. Ich weiß auch nicht so recht, ob das überhaupt ein geeigneter Code für die Manipulation meiner Daten ist. Wäre sehr erfreut über Hilfe. Gruß Manu Zitieren
Klotzkopp Geschrieben 20. Juli 2010 Geschrieben 20. Juli 2010 Der ließt mir zwar meine Datei aus, ich kann ihn jedoch nicht dazu bewegen mir meine ausgelesenen Kommazahlen in Punktzahlen zu verwandeln.Du benutzt std::copy. Diese Funktion kopiert Daten, und beim Kopieren möchte man die Daten üblicherweise nicht verändern. Du könntest std::transform benutzen: int main() { ifstream in("LissajouDaten1.txt"); transform( istream_iterator<char>(in), istream_iterator<char>(), ostream_iterator<char>(cout), [](char c)->char { if(c==',') return '.'; return c; } ); }[/code] Wenn du keinen Compiler hast, der Lambda-Ausdrücke beherrscht, kannst du einen Funktor oder Funktionszeiger für die Transformierung benutzen: [code]struct ReplaceCommaWithPeriod { char operator() (char c) { if(c==',') return '.'; return c; } }; int main() { ifstream in("LissajouDaten1.txt"); transform( istream_iterator<char>(in), istream_iterator<char>(), ostream_iterator<char>(cout), ReplaceCommaWithPeriod() ); } Zitieren
Eleu Geschrieben 20. Juli 2010 Geschrieben 20. Juli 2010 Hallo mathemanu, ich habe nachfolgendes mal probiert: ------------------------------------ #include "apdefap.h" void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName) { char data_4[80] = "Ich habe hier ein , anstatt eines Punktes"; char *pTmp; pTmp = strchr(data_4, (int)','); if (pTmp != NULL){ *pTmp = '.'; } printf(data_4); } --------------------------------------------- Das Komma wird im array of char durch einen Punkt ersetzt und mit printf ausgegeben. Du musst noch dafür sorgen, dass die Zeile aus der Datei in data_4 transferiert wird. Gruß Eleu Zitieren
mathemanu Geschrieben 20. Juli 2010 Autor Geschrieben 20. Juli 2010 Danke für die schnelle Hilfe. Jetzt habe ich aber noch eine Frage. Es handelt sich um die Weiterverarbeitung meiner Daten. Ich brauche Zugriff auf jede einzelne Zahl. Dafür ist der Code doch nicht geeignet, oder? Sollte ich dafür die Datei nicht zeilenweise auslesen und vllt in ein Array schreiben? Ich bin ein wenig verwirrt durch die ganze Flut an Möglichkeiten aus dem Netz. Manu Zitieren
mathemanu Geschrieben 20. Juli 2010 Autor Geschrieben 20. Juli 2010 Ich habe jetzt folgendes programmiert: int main(){ float newrows[10000]; string s; string row; vector<string> rows; ifstream file("LissajouDaten1.txt"); while(getline(file,row)) rows.push_back(row); cout << "File content: " << endl; for(int i = 0; i < rows.size(); i++) { cout << rows[i] << endl; } for(int i = 0; i < rows.size(); i++) { s=rows[i]; s=atof(s.Replace(",",".")); newrows[i]=s; } // cout<< rows[2]<<endl; // cin.get(); } In der letzten Schleife will ich das Komma durch den Punkt ersetzen und gleichzeitig von string zu float konvertieren. Leider bekomme ich aber zwei Fehlermeldungen raus: 1. Replace ist not a member of string 2. Cannot convert string to float Die zweite Meldung ist mir klar, da ich ja keine Ersetzung des Kommas erreicht habe, kann er auch nicht konvertieren. Nun aber meine Frage, wie kann ich denn das Komma ersetzen, wenn ich nicht Replace benutzen kann? Manu Zitieren
Klotzkopp Geschrieben 20. Juli 2010 Geschrieben 20. Juli 2010 Die zweite Meldung ist mir klar, da ich ja keine Ersetzung des Kommas erreicht habe, kann er auch nicht konvertieren.Nein, das ist nicht der Grund. Du versuchst, dem float newrows den String s zuzuweisen, das ist von deiner fehlgeschlagenen Ersetzung völlig unabhängig. Es gibt übrigens in der gesamten C++-Standardbibliothek keine Funktion oder Methode, in deren Namen Großbuchstaben vorkommen. Keine Ahnung, woher du Replace hast. Ich würde erst mal alles in einen Stringstream packen und dabei die Kommas durch Punkte ersetzen, und dann daraus einen float-vector befüllen: ifstream in("LissajouDaten1.txt"); in.unsetf(ios_base::skipws); stringstream ss; transform( istream_iterator<char>(in), istream_iterator<char>(), ostream_iterator<char>(ss), [](char c)->char { if(c==',') return '.'; return c; } ); vector<float> newrows; copy( istream_iterator<float>(ss), istream_iterator<float>(), back_inserter(newrows));[/code] Zitieren
mathemanu Geschrieben 20. Juli 2010 Autor Geschrieben 20. Juli 2010 Habe deinen Vorschlag versucht zu kompilieren, aber bekomme die Fehlermeldung "Expression syntax in line 29". Also bei [](char c)->char { scheint was faul zu sein. Danke für die Antwort. Manu Zitieren
Klotzkopp Geschrieben 20. Juli 2010 Geschrieben 20. Juli 2010 Also bei [](char c)->char { scheint was faul zu sein. Wie ich bereits sagte: Wenn du keinen Compiler hast, der Lambda-Ausdrücke beherrscht, kannst du einen Funktor oder Funktionszeiger für die Transformierung benutzen: Zitieren
mathemanu Geschrieben 21. Juli 2010 Autor Geschrieben 21. Juli 2010 Vielen Dank, stand kurz auf dem Schlauch. Manu Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.