c++ - Datei-E / a & Aufteilung von separator
Ich habe eine Datei mit Daten, die wie folgt aufgelistet:
0, 2, 10
10, 8, 10
10, 10, 10
10, 16, 10
15, 10, 16
17, 10, 16
Ich möchte in der Lage sein, die Eingabe-Datei und teilen Sie es in drei arrays, die in den Prozess trimmen überschüssigen Leerzeichen und umwandeln jedes element zu zahlen.
Aus irgendeinem Grund kann ich nicht finden eine einfache Möglichkeit in c++. Der einzige Erfolg, den ich habe, ist durch die Eingabe jeder Zeile in ein array, und dann regexing alle Leerzeichen und dann aufteilen es. Dieser gesamte Prozess dauerte gute 20-30 Zeilen code und es ist ein Schmerz zu ändern für sagen anderen Trennzeichen(zB. Raum), etc.
Dies ist das python-äquivalent zu dem, was ich möchte in C++:
f = open('input_hard.dat')
lines = f.readlines()
f.close()
#declarations
inint, inbase, outbase = [], [], []
#input parsing
for line in lines:
bits = string.split(line, ',')
inint.append(int(bits[0].strip()))
inbase.append(int(bits[1].strip()))
outbase.append(int(bits[2].strip()))
Den Bedienkomfort tut dies in python ist einer der Gründe, warum ich zog, um es in den ersten Platz. Allerdings, benötige ich zu diesem Zweck in C++ und ich würde es hassen zu müssen, um meine hässlichen 20-30 Zeile code.
Jede Hilfe würde geschätzt, danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es gibt 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:
Gibt es keine wirkliche brauchen, um boost in diesem Beispiel, wie streams wird der trick sehr schön:
Aber wenn ich gehen, um boost würd ich lieber die Einfachheit von tokenizer zu regex... 🙂
Etwas wie:
Außer mit der Fehlerüberprüfung.
std::getline können Sie Lesen eine Zeile text, und Sie können einen string-stream zu analysieren, die einzelnen Linien:
Sobald Sie die Zeile des Texts in der Zeichenfolge, die Sie tatsächlich nutzen können jeder-parsing-Funktion, die Sie wollen, sogar sscanf(buf.c_str(), "%d,%d'%d", &i1, &i2 &i3), mit Hilfe von atoi auf den Teil mit der Ganzzahl, oder durch irgendeine andere Methode.
Können Sie ignorieren auch unerwünschte Zeichen im input-stream, wenn Sie wissen, Sie sind da:
Wenn Euch das nichts ausmacht mit dem Boost-Bibliotheken...
Zieht die Linien aus dem stream, dann verwendet Boost::RegEx-Bibliothek (mit einer capture-Gruppe) zu extrahieren jede Zahl aus den Leitungen. Es wird automatisch ignoriert, was nicht eine gültige Nummer, aber das kann geändert werden, wenn Sie es wünschen.
Ist es immer noch etwa zwanzig Zeilen mit den
#include
s, aber Sie können es verwenden, zum extrahieren von im wesentlichen alles aus der Datei Linien. Dies ist ein triviales Beispiel, ich bin mit so ziemlich identischen code zu extrahieren-tags und die optionalen Werte aus einem Datenbankfeld, der einzige große Unterschied ist der reguläre Ausdruck.EDIT: UPS, du wolltest drei separate Vektoren. Versuchen Sie, diese leichte Modifikation statt:
warum nicht den gleichen code wie in python 🙂 ?
Wenn Sie wollen in der Lage sein, zu skalieren, zu härteren input-Formate, sollten Sie überlegen, Geist, boost-parser combinator library.
Auf dieser Seite hat ein Beispiel, das fast tun, was Sie brauchen (mit reellen zahlen und ein Vektor wäre)