Textdatei zeilenweise auslesen bzw. durchsuchen
-
Hallo Zusammen,
ich möchte gerne eine Textdatei auslesen und darin enthaltene Informationen in einer Variablen speichern.
Die Textdatei sieht in etwa so aus:----nächste info----
1: Name = Hans
2: Alter = 50
----nächste info----
1: Name = Peter
2: Alter = 54Nun möchte ich die Textdatei beispielsweise mit "Name" durchsuchen und mir dann den ersten gefundenen Wert in eine Variable speichern, in diesem Fall also "Hans".
Wie ist das am besten zu bewerkstelligen? Hoffe, dass mir jemand weiterhelfen kann...
Mit freundlichen Grüßen
Everready
-
Ich würde da wahrscheinlich einfach mal alles in einen string einelesen und dann z.B mit boost.regex nach den gewünschten Sachen suchen.
Bei einfachen Sachen reicht die string::find Funktion allerdings auch schon.
-
Hallo,
erstmal danke für die Antwort!
Allerdings werde ich daraus nicht wikrlich schlau...
Bis jetzt habe ich nur zeilenweise per getline ausgelesen. Eventuell steh ich auch grad aufm schlauch!
Könntest du mir eventuell bitte ein kurzes beispiel posten.Mit freundlichen Grüßen
Everready
-
Hallo Everready,
um eine derartige Textdatei zu lesen, brauchst Du weder einen Parser für reguläre Ausdrücke noch musst Du dazu string-Funktionen bemühen. In C++ ist std::istream die Schnittstelle zum Lesen von Text aller Art. Die bietet schon einiges an, mit dem sich ein Großteil der in der Praxis vorkommenden Formate lesen lassen.
In Deinem Fall seine Dir drei Dinge empfohlen (die Variable 'in' sei ein std::istream):
1.)in.ignore( numeric_limits< streamsize >::max(), '=' );überliest alles bis ein '=' im Text erscheint oder End-Of-File
2.)std::string wort; in >> wort;liest ein(!) Wort ein - ohne Zwischenraum bzw. Leerzeichen
3.)int zahl; in >> zahl;liest eine (Ganz)zahl ein.
Wenn Du jezt noch für die Kombination von 'Name' und 'Alter' eine Klasse oder Struktur baust (ist sehr zu empfehlen), dann bietet sich ein sogenannter Streaming-Operator an, um diese Struktur zu lesen. D.h. das Ziel ist es zu schreiben:
Person einePeron; // Person sei eine struct mit Name und Alter in >> einePerson; // liest die Daten der Person vom Text-Stream.Damit das compiliert, schreibt man:
struct Person { friend std::istream& operator>>( std::istream& in, Person& p ); // ... };In dieser (friend-)Funtion ist dann das Einlesen zu implementieren.
Alles zusammen ergibt:
#include <iostream> #include <fstream> #include <vector> #include <string> #include <limits> struct Person { friend std::istream& operator>>( std::istream& in, Person& p ) { using namespace std; in.ignore( numeric_limits< streamsize >::max(), '=' ) >> p.m_name; in.ignore( numeric_limits< streamsize >::max(), '=' ) >> p.m_alter; return in; } //private: std::string m_name; int m_alter; }; int main() { using namespace std; vector< Person > personen; ifstream in( "input.txt" ); // Datei 'input.txt' öffnen for( Person p; in >> p; ) // lese bis Fehler oder End-Of-File personen.push_back( p ); // -- die Personendaten befinden sich jetzt im vector 'personen' ... falls kein Fehler aufgetreten ist return 0; }Hab' ich noch vergessen zu erwähnen: std::ifstream ist natürlich auch ein std::istream
Gruß
Werner