PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ STL: stream zu string?



SeeksTheMoon
09-05-2004, 16:11
Ich soll einer Funktion einen Stream (ifstream) übergeben, der auf eine Textdatei verweist.
In dieser stehen zeilenweise Einträge, die durch Leerzeichen getrennt sind, z.B.

AUTO Porsche 230 16
AUTO Audi 190 12
FAHHRAD Mountainbike 20

ich muss daraus nachher Objekte erzeugen und will deshalb jede Zeile separat als string einlesen, splitten und das dann den passenden Konstruktoren übergeben. Anhand des Schlüsselwortes am Anfang kann ich mir den passenden raussuchen.


Jetzt kommt die große Frage:
Wie hole ich aus dem Stream eine Zeile raus?
Die ganzen STL-Methoden sind irgendwie völlig schrottig; bei sowas wie getline muss man die größe des Streams angeben, was ich natürlich nicht weiß, übergibt noch einen char* und bekommt einen Stream...ARGH
Irgendwie gibts nichts, was mir da weiter hilft...

SeeksTheMoon
09-05-2004, 16:19
es ist immer das gleiche: Man quält sich stundenlang und sucht und überlegt, postet anschließend und eine Sekunde nach dem Posten hat man von alleine die Lösung :D

ifstream in;
string daten;
in>>daten;

sollte es tun: die ganze datei in einen String und den kann man dann anhand der \n splitten (-> Zeilen) und die Zeilen dann nach " " splitten...

wraith
09-05-2004, 16:19
Original geschrieben von SeeksTheMoon

Wie hole ich aus dem Stream eine Zeile raus?
Die ganzen STL-Methoden sind irgendwie völlig schrottig; bei sowas wie getline muss man die größe des Streams angeben, was ich natürlich nicht weiß, übergibt noch einen char* und bekommt einen Stream...ARGH
Irgendwie gibts nichts, was mir da weiter hilft...
getline ist hier aber genau die Lösung :).
Aber nicht die Methode, sondern die globale Funktion


#include <string>
#include <fstream>
...
std::ifstream file("name");
std::string zeile;
getline(file,zeile);

Jetzt kann die Zeile 'beliebig' lang sein.

panzi
09-05-2004, 18:15
(Vieleicht gibt's ne bessere Methode.)

string s;

while( !cin.eof() ) {
s += static_cast< char >( cin.get() );
}

anda_skoa
09-05-2004, 21:16
Original geschrieben von SeeksTheMoon
Ich soll einer Funktion einen Stream (ifstream) übergeben, der auf eine Textdatei verweist.
In dieser stehen zeilenweise Einträge, die durch Leerzeichen getrennt sind, z.B.

AUTO Porsche 230 16
AUTO Audi 190 12
FAHHRAD Mountainbike 20

ich muss daraus nachher Objekte erzeugen und will deshalb jede Zeile separat als string einlesen, splitten und das dann den passenden Konstruktoren übergeben. Anhand des Schlüsselwortes am Anfang kann ich mir den passenden raussuchen.


Da das Leerzeichen das Trennzeichen ist, brauchst du nicht mal die Zeile zu lesen sondern kannst gleich die Elemente lesen, denn beim Lesen aus dem Stream wird am Leerzeichen getrennt.

Deine vier Werte wäre dann so zu lesen


ifstream file(dateiname);
string fahrzeug;
string typ;
int a;
int b;
file >> fahrzeug >> typ >> a >> b;


Ciao,
_

panzi
10-05-2004, 13:20
Hups, hatte die ganze Frage irgendwie net gelesen.... (es war grad Besuch da, hab nebenbei meine AW geschrieben).
Ja so wie's anda_skoa g'schrieben hatt geht's natürlich (am g'scheitersten).