Money Making Machinist Geschrieben 25. März 2005 Autor Geschrieben 25. März 2005 Hey Du hattest recht. Ich war aufm Holzweg, ich wollt ja eigentlich das str[8] in einem switch abfragen und hab dann immer case 1: geschrieben und weil das nicht ging wollt ich den str[8] in einen int umwandeln. Bin grad drauf gekommen das ich nur hätte case '1': schreiben brauchn. Aber trotzdem danke! Zitieren
Money Making Machinist Geschrieben 26. März 2005 Autor Geschrieben 26. März 2005 Me again. Stellt euch vor ihr habt einen String und wollt nun die ersten, sagen wir 5 Zeichen rausmachen. Bsp.: string "Hundekuchen" soll zu "kuchen" werden. Ich hab schon alle Tutorials über Strings die ich habe durchgeschaut und hab nix gefunden. Ich find immer nur strcpy, strncpy usw. Könnt ihr mir das weiterhelfen? Zitieren
carstenj Geschrieben 26. März 2005 Geschrieben 26. März 2005 Hallo, du solltest dir einfach mal meine (und andere) Tipps zu Herzen nehmen und die Seiten, die als Hinweis geliefert werden, ansehen. Dann hättest du gesehen, dass irgendwo in den Beispielen das mystische "substr" auftaucht. Jetzt mag man über die Bedeutung spekulieren, über die Herkunft streiten und über die Funktion rätseln, oder man schaut einfach hier nach: http://www.cppreference.com/cppstring/substr.htm EDIT: Natürlich hängt das auch immer davon ab, was du genau willst: 1. Den Text nach einer genau festgelegten Anzahl Zeichen trennen (z. B. nach 8 Zeichen) 2. Den Text nach einem bestimmten Zeichen (z. B. Leerzeichen) trennen 3. Den Text nach einer bestimmten Zeichenfolge (z. b. Hunde) trennen Je nach Absicht ist die Lösung mehr oder weniger flexibel. Zitieren
Money Making Machinist Geschrieben 29. März 2005 Autor Geschrieben 29. März 2005 Sry muss ich überlesen haben. Das mit dem Tipp zur Cpp-refernce hab ich sogar gespiegelt auf meinem Rechner, also kein Vorwurf dazu. Aber mal ganz ehrlich substr, das sub ist so nichts sagend für einen Anfänger. Zitieren
Money Making Machinist Geschrieben 30. März 2005 Autor Geschrieben 30. März 2005 Soo wieder ein paar Tage sind vergangen und ich steh schon wieder vor einem Problem. Eigentlich funktioniert das was ich machen will, aber auch nur eigentlich. Ich poste mal einen Ausschnitt aus meinem Code: void T_Write_Logfile() { system("cls"); int verwendung; cout << "Should a logfile been written?"; cout << "1: Yes" << '\n'; cout << "2: No" << '\n'; //cout << '\t'; cin >> verwendung; std_write_config(6, verwendung); } int std_write_config(int wahl, int verwendung) { string str_CMethod, str_Source, str_Destination, str_Delete, str_TMethod, str_Logfile; string str_blank, str_sub; ifstream config_file("SCPBMTBPITW-Config.txt"); getline(config_file, str_blank); getline(config_file, str_CMethod); getline(config_file, str_blank); getline(config_file, str_Source); getline(config_file, str_Destination); getline(config_file, str_Delete); getline(config_file, str_TMethod); getline(config_file, str_Logfile); config_file.close(); switch(wahl) { case 1: str_CMethod[13] = verwendung; break; // str_CMethod case 4: str_Delete[32] = verwendung; break; // str_Delete case 5: str_TMethod[13] = verwendung; break; // str_TMethod case 6: str_Logfile[16] = verwendung; break; // str_Logfile } ofstream config_file2("SCPBMTBPITW-Config.txt"); config_file2 << str_blank << '\n'; config_file2 << str_CMethod << '\n'; config_file2 << str_blank << '\n'; config_file2 << str_Source << '\n'; config_file2 << str_Destination << '\n'; config_file2 << str_Delete << '\n'; config_file2 << str_TMethod << '\n'; config_file2 << str_Logfile << '\n'; config_file2.close(); } Ich lese in der ersten Funktion einen Wert ein, und in der zweiten Funktion wird der Wert in die .txt geschrieben. Soweit basst alls, nur das die Ausgabe nicht ganz richtig ist. Ich bekomme das raus: [TOptions] CMethod is = 1 [TOptions] Source is = Destination is = Delete original txt when ready =n TMethod is = 1 Write logfile = Mir gehts vorerst nur um "Write logfile" ich versteh nicht, wieso aus der eingeben 1 dieses r wird. Macht für mich keinen Sinn. Zitieren
Klotzkopp Geschrieben 30. März 2005 Geschrieben 30. März 2005 case 1: str_CMethod[13] = verwendung; break; // str_CMethod case 4: str_Delete[32] = verwendung; break; // str_Delete case 5: str_TMethod[13] = verwendung; break; // str_TMethod case 6: str_Logfile[16] = verwendung; break; // str_Logfile[/CODE]Was tust du da? :confused: Zitieren
Money Making Machinist Geschrieben 30. März 2005 Autor Geschrieben 30. März 2005 Ein Zeichen des Strings durch ein neues Zeichen ersetzen. Zitieren
Klotzkopp Geschrieben 30. März 2005 Geschrieben 30. März 2005 Ein Zeichen des Strings durch ein neues Zeichen ersetzen. Jetzt verstehe ich's. Nur als Tipp: Du handelst dir durch diese "Magic Numbers" auf lange Sicht jede Menge Ärger ein. Stell dir vor, du änderst deine Schlüsselworte. Dann musst du diese Zahlen auch ändern. Jetzt stell dir das ganze bei einem größeren Projekt vor... Das Problem ist, dass du einen int in ein Zeichen umwandelst. Dabei wird der Wert des int als ASCII-Code interpretiert. Wenn verwendung also 0 ist, setzt du ein Stringendezeichen ein, ist verwendung 1, dann ist es ein Zeichen mit dem ASCII-Code 1 (auch nichts lesbares). Am einfachsten löst du das hier, indem du den Code des Zeichens '0' addierst: case 1: str_CMethod[13] = verwendung + '0'; Spätestens bei mehrstelligen Zahlen musst du aber den int in einen String umwandeln. Zitieren
Bubble Geschrieben 30. März 2005 Geschrieben 30. März 2005 Mir ist es jetzt etwas zu mühsam, den ganzen Thread erneut durchzulesen, aber wenn es noch immer um das Finden von Stellen in Textdateien geht, dann würde ich sagen, dass es sich bei dem Problem doch einfach nur um das Suchen von einem String in einem weiteren (der Datei) handelt. Dafür gibt es viele effiziente Algorithmen. Zitieren
Money Making Machinist Geschrieben 30. März 2005 Autor Geschrieben 30. März 2005 Nur als Tipp: Du handelst dir durch diese "Magic Numbers" auf lange Sicht jede Menge Ärger ein. Stell dir vor, du änderst deine Schlüsselworte. Dann musst du diese Zahlen auch ändern. Jetzt stell dir das ganze bei einem größeren Projekt vor... Rein hypotetisch, in einem größeren Projekt, wie würdest Du das dann anders machen. Kleines Codebeispiel vielleicht? Das Problem ist, dass du einen int in ein Zeichen umwandelst. Dabei wird der Wert des int als ASCII-Code interpretiert. Wenn verwendung also 0 ist, setzt du ein Stringendezeichen ein, ist verwendung 1, dann ist es ein Zeichen mit dem ASCII-Code 1 (auch nichts lesbares). Am einfachsten löst du das hier, indem du den Code des Zeichens '0' addierst: case 1: str_CMethod[13] = verwendung + '0'; Spätestens bei mehrstelligen Zahlen musst du aber den int in einen String umwandeln. Aha und wo wir ja grad beim Thema sind, weil mir das mit dem + '\0' weitergeholfen hat, wie würde man das bei einem Buchstaben machen? Zitieren
Klotzkopp Geschrieben 30. März 2005 Geschrieben 30. März 2005 Rein hypotetisch, in einem größeren Projekt, wie würdest Du das dann anders machen. Kleines Codebeispiel vielleicht? Ich würde eine Wrapperklasse für die Einstellungen schreiben. Du solltest die einzelnen Einstellungen auch nicht fest mit den Benutzereingaben verdrahten. Für den Anfang sollte hier aber ausreichen, dass du nicht den bestehenden String änderst - denn damit bist du zusätzlich noch davon abhängig, dass du zuvor eine korrekt formatierte Datei eingelesen hast - sondern den String neu erstellst: case 1: { stringstream s; s << "CMethod is = " << verwendung; str_CMethod = s.str(); } break;[/CODE]Das " is" würde ich übrigens weglassen. Aha und wo wir ja grad beim Thema sind, weil mir das mit dem + '\0' weitergeholfen hat, wie würde man das bei einem Buchstaben machen?Für einzelne Buchstaben (char) ist dein ursprünglicher Code richtig. Zitieren
Money Making Machinist Geschrieben 30. März 2005 Autor Geschrieben 30. März 2005 Ich würde eine Wrapperklasse für die Einstellungen schreiben. Du solltest die einzelnen Einstellungen auch nicht fest mit den Benutzereingaben verdrahten. Wrapperklasse? Ich kenn nur Wraps und das ist was zum Essen. Meinst Du mit nicht verdrahten, das man das so wie in einem Spiel macht, wo man alle Einstellungen ändern kann und die erst beim drücken von 'Okay' gespeichert werden? case 1: { stringstream s; s << "CMethod is = " << verwendung; str_CMethod = s.str(); } break; Was bedeutet s.str()? Also s ist der String okay aber str()? Bzw. stringstream ist mir neu. Zitieren
Klotzkopp Geschrieben 31. März 2005 Geschrieben 31. März 2005 Wrapperklasse? Ich kenn nur Wraps und das ist was zum Essen. Eine Wrapperklasse ist sozusagen ein objektorientierter Mantel um eine oder mehrere Funktion (wie deine Einstellungsfunktionen). Der Vorteil ist, dass Klasseninstanzen im Gegensatz zu Funktionen einen Zustand haben können, der durch die Membervariablen repräsentiert wird. So könntest du z.B. vermeiden, dass du bei jeder Änderung einer einzelnen Einstellung die komplette Datei neu schreiben musst. Meinst Du mit nicht verdrahten, das man das so wie in einem Spiel macht, wo man alle Einstellungen ändern kann und die erst beim drücken von 'Okay' gespeichert werden?Nein, damit meine ich, dass du auf fest im Code vorhandene Abhängigkeiten verzichten sollst. In deinem Code ist der Wert 6 fest mit der Einstellung "Write logfile" verbunden. Warum 6? Warum definierst du nicht eine Abbildung von Schlüsselwörtern auf Einstellungs-IDs? Dann würdest du auch nicht ins Straucheln kommen, wenn ein böser User die Reihenfolge der Zeilen in deiner Datei vertauscht. Was bedeutet s.str()? Also s ist der String okay aber str()? Bzw. stringstream ist mir neu.std::stringstream ist ein Stream, wie z.B. cout oder die Filestreams, nur dass er nicht mit der Konsole oder Dateien arbeitet, sondern mit Strings im Speicher. Und mit str() bekommst du einen String, der alles beinhaltet, was du zuvor in den Stream geschoben hast. Zitieren
Money Making Machinist Geschrieben 4. April 2005 Autor Geschrieben 4. April 2005 Eine Wrapperklasse ist sozusagen ein objektorientierter Mantel um eine oder mehrere Funktion (wie deine Einstellungsfunktionen). Der Vorteil ist, dass Klasseninstanzen im Gegensatz zu Funktionen einen Zustand haben können, der durch die Membervariablen repräsentiert wird. So könntest du z.B. vermeiden, dass du bei jeder Änderung einer einzelnen Einstellung die komplette Datei neu schreiben musst. Du hast nicht zufällig eine Wrapperklasse rumliegen, die Du posten würdest? Weil dann könnt ich mir mal angucken wie ich des so in Zukunft realisieren muss, was da so alles rein muss z.B.. Dann würdest du auch nicht ins Straucheln kommen, wenn ein böser User die Reihenfolge der Zeilen in deiner Datei vertauscht. Also wenn ein User das tatsächlich machen würde, wärs mir echt egal ob des Programm noch funktioniert oder den Rechner irreparabel crasht, weil da is er echt dann selber schuld. std::stringstream ist ein Stream, wie z.B. cout oder die Filestreams, nur dass er nicht mit der Konsole oder Dateien arbeitet, sondern mit Strings im Speicher. Und mit str() bekommst du einen String, der alles beinhaltet, was du zuvor in den Stream geschoben hast. Ahja, hama wieda was glernt. Werd ich mir merken, kann ich bestimmt noch mal gebrauchen. Danke Zitieren
Klotzkopp Geschrieben 4. April 2005 Geschrieben 4. April 2005 Du hast nicht zufällig eine Wrapperklasse rumliegen, die Du posten würdest? Weil dann könnt ich mir mal angucken wie ich des so in Zukunft realisieren muss, was da so alles rein muss z.B..Solche Klassen sind üblicherweise genau auf den Anwendungszweck zugeschnitten, da wird dir Beispielcode wenig nützen. Also wenn ein User das tatsächlich machen würde, wärs mir echt egal ob des Programm noch funktioniert oder den Rechner irreparabel crasht, weil da is er echt dann selber schuld.Das sehe ich nicht so. Wenn du die Daten in einer Datei in einem für Menschen lesbaren Format ablegst, und noch dazu mit der Endung .txt, dann würde für mich als Benutzer der Schluss naheliegen, dass ich die auch von Hand verändern kann. Und wenn die Reihenfolge der Zeilen festgelegt wäre, bräuchtest du die Schlüsselworte nicht. 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.