Teile eines Strings in einer Strukturvariablen speichern

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Orioner
Beiträge: 102
Registriert: Mo Dez 10, 2012 10:52 am

Teile eines Strings in einer Strukturvariablen speichern

Beitrag von Orioner » Do Dez 13, 2012 8:55 pm

Ich möchte aus einer Text-Datei Zeilen auslesen und anhand eines bestimmten Zeichens zerlegen. Die "Bruchstücke" möchte ich in einer Strukturvariablen speichern. Zu Testzwecken habe ich eine Struktur, die aus 2 Strings besteht und aus 2 Integern. Die Test-Text-Datei ist so aufgebaut, dass sie in die Struktur passt. Und das habe ich bereits:

Code: Alles auswählen

getline( dat_in, str2 );
cstr = new char [str2.size()+1];
strcpy ( cstr, str2.c_str() );
pch = strtok( cstr, ";" );
while ( pch != NULL ) {
    cout << pch << endl;
    pch = strtok( NULL, ";" );
}
Dieser Code führt dazu, dass die Tokens auf dem Bildschirm angezeigt werden. Ich möchte sie aber in der Strukturvariablen speichern. Weiß jemand, wie ich das anstellen kann? (Irgendwie komme ich immer mit dieser Vermischung von Strings und Char-Array durcheinander, bis ich gar nicht mehr durchsehe. Die Strukutr, aus der ich später auch noch ein Array aufbauen will, weil die Datei mehrere Zeilen haben wird, macht es nicht unbedingt einfacher.)

Was ich weiß ist, dass ich später u. U. noch die Funktion "atoi" benötige. Damit komme ich klar, doch bis dahin bin ich planlos.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Teile eines Strings in einer Strukturvariablen speichern

Beitrag von cloidnerux » Do Dez 13, 2012 9:43 pm

Damit komme ich klar, doch bis dahin bin ich planlos.
Ich auch. Was willst du jetzt nochmal genau erreichen?
Irgendwie komme ich immer mit dieser Vermischung von Strings und Char-Array durcheinander, bis ich gar nicht mehr durchsehe.
=> Du hast keine Ahnung was ein "String" ist.
Wikipedia sagt:
Wikipedia hat geschrieben:Eine Zeichenkette oder (aus dem Englischen) ein String ist in der Informatik eine Folge von Zeichen (z. B. Buchstaben, Ziffern, Sonderzeichen und Steuerzeichen) aus einem definierten Zeichensatz. Zeichen können sich in einer Zeichenkette wiederholen, die Reihenfolge der Zeichen ist definiert. Zeichenketten sind somit Sequenzen aus Symbolen mit endlicher Länge.
Auch eine String-Klasse speichert den Text in einem Char-array. Damit macht die nix anderes als ein char-Array, nur dass du etwas annehmlicher ist, damit umzugehen, da die Funktionen gekapselt sind.
ich in einer Strukturvariablen speichern.
Es gibt keinen Datentyp "Strukturvariable", noch definierst du eine Klasse dafür. Was soll das sein, eine "Strukturvariable"?
Dieser Code führt dazu, dass die Tokens auf dem Bildschirm angezeigt werden. Ich möchte sie aber in der Strukturvariablen speichern. Weiß jemand, wie ich das anstellen kann?
Dein Code ist im Grunde grober Unsinn. Du beschwerst dich auf der einen Seite, dass du keine C-Strings(char-arrrays) verwenden willst, auf der anderen Seite scheinst du auch die C++-String Methoden zu verweigern:
http://www.cplusplus.com/reference/string/string/
Bleib bitte konsistent in dem was du machst.
Weiß jemand, wie ich das anstellen kann?
Was ich bisher verstanden habe:
Du hast eine Datei im CSV-Stil(Comma Seperated Values, hier halt mit nem Semikolon). Diese Willst du auslesen, auswerten und in eine Datenstruktur sichern?
Dazu würde ich die Datei einlesen, Zeile für Zeile separieren, also nach einem "\n" suchen, diese dann auswerten und auf eine Liste(z.B Datentyp vector) ein neues Objekt/Struct zu speichern, dass eben diese Daten aufnimmt.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Fisherman
Beiträge: 84
Registriert: Mi Jun 06, 2012 4:53 am
Wohnort: 127.0.0.1

Re: Teile eines Strings in einer Strukturvariablen speichern

Beitrag von Fisherman » Fr Dez 14, 2012 11:08 am

Ich möchte aus einer Text-Datei Zeilen auslesen und anhand eines bestimmten Zeichens zerlegen.
Im Grunde nach möchtest du einen "Parser" bauen. Vielleicht hilft Dir diese Seite ein wenig weiter.

Gruß Fisherman
There is no place like 127.0.0.1

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Teile eines Strings in einer Strukturvariablen speichern

Beitrag von Xin » Fr Dez 14, 2012 6:37 pm

Beschreib mal das Problem genauer - also das, was Du lösen musst. Was hast Du vorliegen, was soll nach Deinem Programm passiert sein.
Dann beschreibst Du die Probleme, die Du dabei derzeit hast.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Orioner
Beiträge: 102
Registriert: Mo Dez 10, 2012 10:52 am

Re: Teile eines Strings in einer Strukturvariablen speichern

Beitrag von Orioner » Sa Dez 15, 2012 5:08 pm

Aus Zeitgründen und weil ich ihn nicht vor den Kopf stoßen will, wie er mich, verzichte ich einmal darauf, auf den Beitrag von cloidnerux einzugehen, obwohl ich sagen muss, dass mich das Lesen dieses Beitrags ganz schön aufgebracht hat. Immerhin, er hat dann doch versucht, mir zu helfen.

Ich möchte das ganze in C++ schreiben und das sind meine Ausgangsdaten:
Orknase;Äxte;1;5;-1;-3;14;
Khunchomer;Hiebwaffen;1;4;0;-1;14;
Langbogen;Schußwaffen;1;4;0;0;-;
Schwert;Schwerter;1;4;0;0;14;
Speer;Speere;1;3;0;-3;-;
Mengbilar;Stichwaffen;1;1;-3;-4;16;
Bloße Hand;Waffenlos;1;0;0;0;-;
Wurfaxt;Wurfwaffen;1;3;-1;-4;-;
Bastardschwert;Zweihänder;1;5;-1;-2;14;
Wie Fisherman schon richtig erfasst hat, möchte ich die CSV-Datei parsen (wenn der Begriff an dieser Stelle richtig verwendet ist).
Dabei sollen die Informationen in einer Datenstruktur erfasst werden (weil sich damit wohl am besten arbeiten lässt). Günstiger Weise ist dies eine dynamische Struktur, da die Eingabedaten variieren könnten. Zur Not reicht aber auch ersteinmal eine Feldvariable (sagt man dazu "Feldstruktur"?) mit fester Größe.
Schließlich möchte ich mit den Zahlenwerten aus den Eingabedaten noch einfache Berechnungen durchführen, deren Ergebnisse Nachkommastellen aufweisen können, die berücksichtigt werden und ggf. mathematisch gerundet werden sollen.
Anhand der Ergebnisse der einzelnen Berechnungen (die Informationen aus einer Zeile dienen jeweils als Information für eine Berechnung), soll ein Ranking der verschiedenen Waffen erstellt werden, das in Textform in einer Datei ausgegeben und auf dem Bildschirm dargestellt werden soll.

Probleme:
  • Welchen Datentyp haben die Werte, nachdem sie in der Struktur gelandet sind, bzw. wie sollte die Struktur aussehen? Sind ersteinmal alles Char-Arrays (sprich C-Strings)?
  • Manche Daten sind Zahlen und lassen sich in Integer verwandeln, aber nicht alle. Bei manchen Werten steht nur ein Bindestrich. Die sollen auf einen bestimmten Wert gesetzt werden, mit dem ich dann rechnen kann.
  • Nun kann man ja, wie hier beschrieben, Strings in Tokens zerlegen; das sieht dann in C u. a. so aus:

    Code: Alles auswählen

    pch = strtok( str, " ,.-" );
    while( pch != NULL )
    {
        printf( "%s\n", pch );
        pch = strtok( NULL, " ,.-" );
    }
    Es gibt ein paar Dinge, die ich daran nicht verstehe:
    Beim ersten Aufruf von strtok steht in der Klammer der String ("str"). Beim zweiten Aufruf (innerhalb der While-Schleife) steht "NULL".
    1. Warum wird strtok zwei Mal aufgerufen und nicht nur einmal, nämlich innerhalb einer Schleife?
    2. Warum wird strtok einmal mit str und einmal mit NULL als Parameter aufgerufen?
    3. Würdet ihr zuerst die ganze Datei einlesen und dann von Trennzeichen zu Trennzeichen (in meinem Fall ein Semikolon), separieren oder würdet ihr die Datei zeilenweise einlesen und entsprechend separieren (Mit jeder neuen Zeile würde dann in das nächste Element der Feldvariablen (der Struktur) gespeichert werden.)
Vielleicht bin ich mit meinem Anliegen ja auch falsch, in diesem Forum (z. B. weil hier andere Arten von Problemen diskutiert werden). Dann wäre ein freundlicher Hinweis angebracht. Anderen Falls folgen weitere Details zu meinem Problem/Programm (vor allem auf Anfrage, da ich atm nicht weiß, was ich noch schreiben soll).

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Teile eines Strings in einer Strukturvariablen speichern

Beitrag von Xin » Sa Dez 15, 2012 5:49 pm

Orioner hat geschrieben:Aus Zeitgründen und weil ich ihn nicht vor den Kopf stoßen will, wie er mich, verzichte ich einmal darauf, auf den Beitrag von cloidnerux einzugehen, obwohl ich sagen muss, dass mich das Lesen dieses Beitrags ganz schön aufgebracht hat. Immerhin, er hat dann doch versucht, mir zu helfen.
Wir sitzen nicht vor Deinem Code, kennen Dein Problem und Deine Fähigkeiten nur von einem kleinen Stückchen Text.

Du fragst nachfolgend, ob der Begriff "parsen" richtig verwendet wird - wird es. Aber entsprechend kann man nur grob einschätzen, wie man Dir Informationen zuspielt - insbesondere, wenn Du auf die falschen Reaktionen offen verärgert reagierst.
Orioner hat geschrieben:Probleme:
  • Welchen Datentyp haben die Werte, nachdem sie in der Struktur gelandet sind, bzw. wie sollte die Struktur aussehen? Sind ersteinmal alles Char-Arrays (sprich C-Strings)?
Kommt logischerweise auf Deine Datenstruktur an. Ich würde die entsprechenden Datentypen wählen, damit die Informationen, die erstmal in der Datenstruktur sind, nicht mehr falsch repräsentiert werden können. Als negative Werte sollten entsprechend nicht "b4" möglich sein.
Das geht mit (unsigned int) entsprechend nicht.
Orioner hat geschrieben: [*]Manche Daten sind Zahlen und lassen sich in Integer verwandeln, aber nicht alle. Bei manchen Werten steht nur ein Bindestrich. Die sollen auf einen bestimmten Wert gesetzt werden, mit dem ich dann rechnen kann.
Bindestrich mit strcmp vergleichen und ggfs. den Defaultwert in die Struktur schreiben.
Orioner hat geschrieben: [*]Nun kann man ja, wie hier beschrieben, Strings in Tokens zerlegen; das sieht dann in C u. a. so aus:

Code: Alles auswählen

pch = strtok( str, " ,.-" );
while( pch != NULL )
{
    printf( "%s\n", pch );
    pch = strtok( NULL, " ,.-" );
}
Es gibt ein paar Dinge, die ich daran nicht verstehe:
Beim ersten Aufruf von strtok steht in der Klammer der String ("str"). Beim zweiten Aufruf (innerhalb der While-Schleife) steht "NULL".
  1. Warum wird strtok zwei Mal aufgerufen und nicht nur einmal, nämlich innerhalb einer Schleife?
  2. Warum wird strtok einmal mit str und einmal mit NULL als Parameter aufgerufen?
strtok merkt sich die Position, wo es aufgehört hat, nach Tokens zu suchen. Übergibst Du NULL wird an der Stelle weitergesucht.
Orioner hat geschrieben:[*]Würdet ihr zuerst die ganze Datei einlesen und dann von Trennzeichen zu Trennzeichen (in meinem Fall ein Semikolon), separieren oder würdet ihr die Datei zeilenweise einlesen und entsprechend separieren (Mit jeder neuen Zeile würde dann in das nächste Element der Feldvariablen (der Struktur) gespeichert werden.)
Ich habe mir eine C++-Klasse geschrieben, die mich verhältnismäßig einfach durch ein File parsen lässt. Diese lädt das komplette File, da ich - im Gegensatz zu Dir - nicht davon ausgehen kann, dass Datensätze zeilenweise übergeben werden.

Zeilenweise hat den Vorteil, dass Du beliebig große Dateien einlesen kannst und den Nachteil, dass Du immerwieder kleine Stückchen einlesen musst.
Orioner hat geschrieben:Vielleicht bin ich mit meinem Anliegen ja auch falsch, in diesem Forum (z. B. weil hier andere Arten von Problemen diskutiert werden). Dann wäre ein freundlicher Hinweis angebracht. Anderen Falls folgen weitere Details zu meinem Problem/Programm (vor allem auf Anfrage, da ich atm nicht weiß, was ich noch schreiben soll).
Falsch bist Du hier nicht. Aber vielleicht ist die Erwartung falsch.

Wenn ich jemanden um Hilfe bitte, dann helfe ich dieser Person mir zu helfen, denn niemand ist verpflichtet, Dir zu helfen. Wir machen das freiwillig, ohne Bezahlung und ohne eigenen Nutzen. Entsprechend ist die Motivation, dass der Fragende entsprechend auftritt und nicht nur seine Probleme präsentiert und dann von den anderen erwartet, dass sie aus irgendeiner Kristallkugel sofort die perfekte Lösung liefern.

Also freu Dich, wenn Dir jemand helfen kann, statt Dich darüber aufzuregen, wenn Dich jemand nicht sofort richtig versteht.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Teile eines Strings in einer Strukturvariablen speichern

Beitrag von cloidnerux » Sa Dez 15, 2012 7:48 pm

Aus Zeitgründen und weil ich ihn nicht vor den Kopf stoßen will, wie er mich, verzichte ich einmal darauf, auf den Beitrag von cloidnerux einzugehen, obwohl ich sagen muss, dass mich das Lesen dieses Beitrags ganz schön aufgebracht hat. Immerhin, er hat dann doch versucht, mir zu helfen.
Ich habe einen provokativen Beitrag geschrieben, das habe ich auch bewusst gemacht. Das du dich dadurch angegriffen fühlst und dich hier im Forum abgelehnt fühlst, kann ich verstehen. Das will ich aber nicht erreichen, ich wollte das du über dein Problem nachdenkst und das hast du nun auch gemacht.
Dein Problem war/ist es, dass du dir selber einen Anspruch stellst, den du nicht halten kannst, da dir die entsprechenden Erfahrungen fehlen.
Dabei sollen die Informationen in einer Datenstruktur erfasst werden (weil sich damit wohl am besten arbeiten lässt).
Was ist eine Datenstruktur?
Eine Datenstruktur ist eine Anordnung aus Daten, also Variablen. Durch das verknüpfen von Variablen mit einem Sinnzusammenhang erhälst du eine "Datenstruktur".
Das wäre z.B eine primitive Datenstruktur:

Code: Alles auswählen

struct foo
{
   int a;
   int b;
};
Du hast zwei ints, die in einem Struct gekapselt sind und damit einen Sinnzusammenhang haben. Könnte man als eindimensionale Datenstruktur bezeichnen.
Wenn wir jetzt ein Array aus diesen Structs anlegen:

Code: Alles auswählen

struct data[100];
Haben wir eine zweidimensionale Datenstruktur. Du hast 100 Datensätze aus je zwei Ints, die irgendwie zusammenhängen. Das ist eine Datenstruktur.
In deinem Fall muss also die Datenstruktur Variablen oder Texte für jede Informationen einer Zeile beinhalten. Name der Waffe, wäre ein Text. Art der Waffe, in deinem Fall auch ein text. Und noch 5 Zahlen, das wären wohl ints.
Nun zur Auswertung. Wo kommen deine Daten her, in welcher Formen kommen sie?
DU hast eine Textdatei im CSV-Stil.
Eine Datenzeile wird durch ein "\n"(Neue Zeile) oder dem EOF gekennzeichnet. Ein einzelner Wert wird durch ein Semikolon getrennt. Alle Zeilen haben die Daten-reinfolge: Name, Art, 5 Werte.
Du zerteilst sie in Teilstrings, kannst das, was String bleiben soll gleich speichern, was zu einer Zahl werden soll, musst du halt noch Konvertieren.

Nun willst du aber in C++ arbeiten. Dann willst du ja sicherlich auch Klassen haben, willst also jede Waffe als Instanz in einer Liste haben. Eine Klasse hat Eigenschaften(Funktionen) und Attribute. Damit erweitert dir eine Klasse den Sinnzusammenhang zwischen Variablen und Funktionen. Damit lassen sich diese auch mit Daten füttern und in einem Array speichern.

MfG cloidnerux.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Orioner
Beiträge: 102
Registriert: Mo Dez 10, 2012 10:52 am

Re: Teile eines Strings in einer Strukturvariablen speichern

Beitrag von Orioner » Sa Dez 15, 2012 11:00 pm

Xin hat geschrieben:Also freu Dich, wenn Dir jemand helfen kann, statt Dich darüber aufzuregen, wenn Dich jemand nicht sofort richtig versteht.
Ohne nun den zweiten Beitrag von cloidnerux gelesen zu haben will ich sofort auf deinen Beitrag reagieren, Xin: Ich glaube, wir haben uns gründlich missverstanden. Selbstverständlich freue ich mich über jeden noch so kleinen Hilfswink. Ich rege mich auch überhaupt nicht auf und schon gar nicht darüber, dass ich nicht richtig verstanden werde. Ich war nur etwas darüber betrübt, gleich eingeschätzt zu werden, obwohl - und gerade weil - wir uns (noch) nicht richtig kennen.

Das man mich nicht richtig verstehen könnte, ist mir in dem Moment des Schreibens nicht unbedingt bewusst und man kann mir dies mitteilen, ohne über mich zu urteilen - oder gar zu verurteilen, wie es mir vorkam.
Xin hat geschrieben:Entsprechend ist die Motivation, dass der Fragende entsprechend auftritt und nicht nur seine Probleme präsentiert und dann von den anderen erwartet, dass sie aus irgendeiner Kristallkugel sofort die perfekte Lösung liefern.
Das erwarte ich nicht.
Xin hat geschrieben:Falsch bist Du hier nicht. Aber vielleicht ist die Erwartung falsch.
Das glaube ich nicht.

Aber ich weiß es zu schätzen, dass du dir über die Situation Gedanken machst und damit mich zum Nachdenken anregst. Doch jetzt will ich ersteinmal in Ruhe eure beiden Beiträge lesen und "verarbeiten".

Antworten