Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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! :)

Geschrieben

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?

Geschrieben

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.

Geschrieben

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.

Geschrieben
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:
Geschrieben
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.

Geschrieben

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.

Geschrieben

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?

Geschrieben
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.
Geschrieben
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. :D

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.

Geschrieben
Wrapperklasse? Ich kenn nur Wraps und das ist was zum Essen. :D
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.
Geschrieben
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 :)
Geschrieben
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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...