Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

dfex

Junior Schreiberling

  • "dfex" is male

Posts: 248

Date of registration: Dec 11th 2001

21

Wednesday, May 21st 2003, 2:13pm

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" is male
  • "MAX" started this thread

Posts: 822

Date of registration: Dec 11th 2001

Location: Hannover

22

Thursday, May 22nd 2003, 9:10am

nee

Quoted

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" is male

Posts: 39

Date of registration: Mar 24th 2002

Location: Hannover

23

Thursday, May 22nd 2003, 11:44am

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" is male
  • "MAX" started this thread

Posts: 822

Date of registration: Dec 11th 2001

Location: Hannover

24

Thursday, May 22nd 2003, 1:37pm

aha

Quoted

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" is male

Posts: 39

Date of registration: Mar 24th 2002

Location: Hannover

25

Thursday, May 22nd 2003, 2:00pm

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" is male
  • "MAX" started this thread

Posts: 822

Date of registration: Dec 11th 2001

Location: Hannover

26

Thursday, May 22nd 2003, 7:31pm

Jo

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