c ++ Datei io & Aufteilung nach Trennzeichen

8

Ich habe eine Datei mit Daten wie folgt aufgelistet:

%Vor%

Ich möchte in der Lage sein, die Datei einzugeben und sie in drei Arrays aufzuteilen, dabei alle überflüssigen Leerzeichen zu trimmen und jedes Element in Ganzzahlen umzuwandeln.

Aus irgendeinem Grund kann ich keinen einfachen Weg finden, dies in C ++ zu tun. Der einzige Erfolg, den ich hatte, besteht darin, jede Zeile in ein Array einzugeben und dann alle Leerzeichen neu zu definieren und dann aufzuteilen. Dieser ganze Prozess hat mir gut 20-30 Codezeilen gekostet und es ist ein Schmerz, ihn zu modifizieren, zum Beispiel für ein anderes Trennzeichen (zB Leerzeichen) usw.

Dies ist das Python-Äquivalent von dem, was ich in C ++ haben möchte:

%Vor%

Die Benutzerfreundlichkeit, dies in Python zu tun, ist einer der Gründe, warum ich überhaupt dazu gekommen bin. Allerdings muss ich dies jetzt in C ++ tun und ich würde es hassen, meinen hässlichen 20-30 Zeilencode verwenden zu müssen.

Jede Hilfe wäre willkommen, danke!

    
darudude 06.11.2008, 01:49
quelle

7 Antworten

4

Es ist wirklich nichts falsch mit fscanf, das ist wahrscheinlich die schnellste Lösung in diesem Fall. Und es ist so kurz und lesbar wie der Python-Code:

%Vor%     
ididak 06.11.2008, 08:26
quelle
6

In diesem Beispiel muss Boost nicht unbedingt verwendet werden, da Streams den Trick gut machen:

%Vor%

Obwohl ich Boost verwenden würde, würde ich die Einfachheit von Tokenizer Regex ...:)

    
MattyT 06.11.2008 05:30
quelle
2

Etwas wie:

%Vor%

Außer bei der Fehlerprüfung.

    
MattSmith 06.11.2008 02:03
quelle
1
Mit

std :: getline können Sie eine Textzeile lesen und mit einem String-Stream die einzelne Zeile analysieren:

%Vor%

Sobald Sie die Textzeile in die Zeichenfolge eingefügt haben, können Sie tatsächlich jede gewünschte Parsing-Funktion verwenden, sogar sscanf (buf.c_str (), "% d,% d '% d", & amp; i1, & amp; i2, & amp; i3), indem atoi auf der Teilkette mit der ganzen Zahl oder durch eine andere Methode verwendet wird.

Sie können auch unerwünschte Zeichen im Eingabestream ignorieren, wenn Sie wissen, dass sie da sind:

%Vor%     
Raymond Martineau 06.11.2008 02:39
quelle
1

Wenn es Ihnen nichts ausmacht, die Boost-Bibliotheken zu verwenden ...

%Vor%

Dadurch werden die Zeilen aus dem Stream abgerufen und die Boost :: RegEx-Bibliothek (mit einer Erfassungsgruppe) verwendet, um die einzelnen Zahlen aus den Zeilen zu extrahieren. Es ignoriert automatisch alles, was keine gültige Nummer ist, obwohl das geändert werden kann, wenn Sie möchten.

Es sind immer noch etwa zwanzig Zeilen mit dem #include s, aber Sie können damit im Wesentlichen alles aus den Zeilen der Datei extrahieren. Dies ist ein triviales Beispiel, ich verwende ziemlich identischen Code, um Tags und optionale Werte aus einem Datenbankfeld zu extrahieren, der einzige Hauptunterschied ist der reguläre Ausdruck.

EDIT: Hoppla, Sie wollten drei verschiedene Vektoren. Versuchen Sie diese geringfügige Änderung stattdessen:

%Vor%     
Head Geek 06.11.2008 03:31
quelle
1

Warum nicht den gleichen Code wie in Python :)?

%Vor%     
da_m_n 06.11.2008 09:02
quelle
0

Wenn Sie auf härtere Eingabeformate skalieren möchten, sollten Sie spirit, boost parser combinator library in Betracht ziehen.

Diese Seite hat ein Beispiel, das fast was macht du brauchst (mit reals und einem Vektor)

    
David Pierre 06.11.2008 09:29
quelle

Tags und Links