Ich habe ein Problem gefunden, um msg aus einer Datei mit C++ zu lesen. In der Regel erstellen die Benutzer einen Dateistream und verwenden dann die Funktion getline()
, um die Nachricht abzurufen. getline()
Funktion kann einen zusätzlichen Parameter als Trennzeichen akzeptieren, so dass es jede "Zeile" getrennt durch das neue Trennzeichen, aber nicht standardmäßig '\ n' zurückgibt. Dieses Trennzeichen muss jedoch ein Zeichen sein. In meinem Anwendungsfall ist es möglich, dass das Trennzeichen in der msg etwas anderes ist als "| - |", also versuche ich eine Lösung zu finden, die eine Zeichenkette als Trennzeichen anstelle eines Zeichens akzeptiert.Lesen von FileStream mit beliebigem Trennzeichen
Ich habe StackOverFlow ein wenig gesucht und einige interessante Beiträge gefunden. Parse (split) a string in C++ using string delimiter (standard C++) Dieser gibt eine Lösung, string::find()
und string::substr()
zu verwenden, um mit beliebigem Trennzeichen zu analysieren. Alle Lösungen, die dort angenommen werden, sind jedoch eine Zeichenfolge anstelle eines Streams. In meinem Fall sind die Daten des Datenstroms zu groß, um in den Speicher zu passen, so dass sie in msg nach msg (oder einem Großteil von msg at Einmal).
Eigentlich lesen Sie durch die GCC-Implementierung von std::getline()
Funktion, es scheint, es ist viel einfacher zu handhaben, die Fallbegrenzer ist eine einzige char. Da Sie jedes Mal, wenn Sie einen Teil der Zeichen laden, immer das Trennzeichen suchen und trennen können. Während es anders ist, wenn das Trennzeichen mehr als ein Zeichen ist, kann das Trennzeichen selbst zwischen zwei verschiedenen Abschnitten liegen und viele andere Fälle verursachen.
Nicht sicher, ob jemand andere diese Art von Anforderung vor hat und wie Sie es elegant behandelt. Es scheint, es wäre schön, eine Standardfunktion wie istream& getNext (istream&& is, string& str, string delim)
zu haben? Dies scheint mir ein allgemeiner Anwendungsfall zu sein. Warum nicht diese in Standard lib, so dass die Leute nicht mehr ihre eigene Version separat implementieren?
Vielen Dank
getline mit einer Zeichenfolge würde Lookahead erfordern, so dass es im Allgemeinen langsamer sein könnte. Nur Spekulation. Wir müssen unsere eigene benutzerdefinierte getline implementieren. – AndyG
Gibt es eine elegante Implementierung? Wie Sie bereits erwähnt haben, macht Lookahead den Code kompliziert.vielleicht eine FSM eine elegante Lösung? –
Der Lookahead wäre eine einfache FSM haha, einfach nicht so kompliziert wie ein regulärer Ausdruck. Der Kern des Programms besteht darin, Zeichen einzulesen, bis Sie den "delimiter" -Zustand erreichen, und diese Zeichen dann zu einer Zeichenkette zu analysieren. Wenn Sie nur an einer Lösung interessiert sind, die "funktioniert", verwenden Sie einen "std :: vector" und spielen Sie herum. Eine "optimale" Lösung wäre ein wenig schwieriger. Wenn niemand etwas beantwortet, schreibe ich etwas auf. – AndyG