Sie sind nicht angemeldet.

dfex

Junior Schreiberling

  • »dfex« ist männlich

Beiträge: 248

Registrierungsdatum: 11.12.2001

21

21.05.2003, 14:13

Hi!
Also erstmal kannste ja von nem Stream sowieso nur das "Oberste" lesen.
Was dir vielleicht hilft sind die Methoden peek() und get()

peek() liest das erste Zeichen ohne es vom Stream zu entfernen und get() liest das erste Zeichen und entfernt es.

Damit kannst du den Stream dann mit einem Zeichen "lookahead" abarbeiten.

cu, mb

MAX

Senior Schreiberling

  • »MAX« ist männlich
  • »MAX« ist der Autor dieses Themas

Beiträge: 822

Registrierungsdatum: 11.12.2001

Wohnort: Hannover

22

22.05.2003, 09:10

nee

Zitat

Also erstmal kannste ja von nem Stream sowieso nur das "Oberste" lesen.
Was dir vielleicht hilft sind die Methoden peek() und get()


Das ist nicht richtig! Siehe hier Man kann von einem istream mit dem get(stringbuf &b, char delim) Befehl bis zu einem bestimmten Zeichen in einen stringbuf lesen.

Ich habe auch schon ausprobiert Zeichen für Zeichen zu lesen und zu speichern (Nachteil -> langsam). Auch bestimmte Sonderzeichen schmeisse ich vorher weg. Das Problem ist, dass cube.dat problemlos eingelesen wird, aber andere Dateien nicht. Ich vermute, dass in dieser Datei noch irgendwelche Sonderzeichen drinstehen, so dass sie als "Return" interpretiet werden.
So dass dann das Lesen einfach an dieser Stelle beendet wird.
mfg
MAX

Irishman

Trainee

  • »Irishman« ist männlich

Beiträge: 39

Registrierungsdatum: 24.03.2002

Wohnort: Hannover

23

22.05.2003, 11:44

Das Problem, daß nur eine der 3 Beispieldateien richtig geparst wurde, hatte ich auch. Der Grund ist, daß in zwei Dateien an einer bestimmten Stelle (ich glaube, beim Anfang der Vertices) ein Zeilenvorschub stattfindet, bei der anderen aber nicht. Deshalb muß man an allen geeigneten Stellen (auch die oben angesprochene) die White-Spaces (std::ws) berücksichtigen, dann klappt es.

MAX

Senior Schreiberling

  • »MAX« ist männlich
  • »MAX« ist der Autor dieses Themas

Beiträge: 822

Registrierungsdatum: 11.12.2001

Wohnort: Hannover

24

22.05.2003, 13:37

aha

Zitat

Das Problem, daß nur eine der 3 Beispieldateien richtig geparst wurde, hatte ich auch. Der Grund ist, daß in zwei Dateien an einer bestimmten Stelle (ich glaube, beim Anfang der Vertices) ein Zeilenvorschub stattfindet, bei der anderen aber nicht. Deshalb muß man an allen geeigneten Stellen (auch die oben angesprochene) die White-Spaces (std::ws) berücksichtigen, dann klappt es.

Das ist sehr interessant. Muss mir angucken, wie man std::ws benutzt. (Kannst du es vielleicht verraten?)
mfg
MAX

Irishman

Trainee

  • »Irishman« ist männlich

Beiträge: 39

Registrierungsdatum: 24.03.2002

Wohnort: Hannover

25

22.05.2003, 14:00

Ein gutes Beispiel ist die read-Methode aus der Vector3d-Klasse, finde ich:

// Lies Vektor von istream
int Vector3d::read(std::istream& is) {
if(is.get()!='(')
return 0;
is>>std::ws>>x>>std::ws;
if(is.get()!=',')
return 0;
is>>y>>std::ws;
if(is.get()!=',')
return 0;
is>>z>>std::ws;
/*if(is.get()!=',')
return 0;
is>>w>>std::ws;*/
if(is.get()!=')')
return 0;
return 1;
}

Mit std::ws überliest man, glaube ich, alle Leerzeichen, Tabulatoren und Zeilenvorschübe, bis das nächste relevante Zeichen kommt. Benutzt habe ich es wie in der oberen Methode.

Ich hoffe, das war einigermaßen verständlich.

MAX

Senior Schreiberling

  • »MAX« ist männlich
  • »MAX« ist der Autor dieses Themas

Beiträge: 822

Registrierungsdatum: 11.12.2001

Wohnort: Hannover

26

22.05.2003, 19:31

Jo

Danke für den Hinweis! Jetzt habe ich es!!!
mfg
MAX