Kommentarzeilen trotzdem einlesen
-
Hi !
ich möchte aus einer Datei, wie unten aufgeführt, Zahlen auslesen:
-9.7 -1.8
-8.6 -2.4
#-7.5 -3
#-6.4 -3.6
-5.3 -4.2
-4.2 -4.8
-3.1 -5.4
-2 -6
-0.9 -6.6Die erste Spalte stellt übrigens die X Koordinate, die zweite die Y-Koordinate dar, die wie folgt in das X und Y array eingelesen werden.
Ist ja nichts besonders und hab ich im Prinzip so gelöst:
ReadGridData(ifstream &in, int nY, int, nX) { double X[nY][nX]; double Y[nY][nX]; for (int j = 0; j < nY; j++) { for (int i = 0; i < nX; i++) { in >> X[j][i]; in >> Y[j][i]; } } }Wie aber schon ersehbar, sind einige Zeilen auskommentiert, ich möchte die Zahlen dahinter aber wie gewohnt in das Array einlesen.
Die einzige Idee, die mir bisher kam ist, mit
char ch; if (in.get(ch) == "#")auf eine Route überprüfen, und danach wie gewohnt fortverfahren, da ja der Lesezeiger um ein char weitergerückt ist,
und falls != "#" mit dem Lesezeiger wieder um ein Zeichen zurückzugehen.Aber weder weiß ich wie das funktioniert, noch erscheint mir diese Lösung schön.

Wäre um jeden Tip sehr dankbar!

Lieben Gruß,
GiantGeorge
-
es gibt zumindest ein in.putback(ch), aber da ich eher weniger der c++ freak bin, kann ich Dir auch nicht sagen, ob das die beste lösung ist...
-
GiantGeorge schrieb:
Die einzige Idee, die mir bisher kam ist, mit
char ch; if (in.get(ch) == "#")auf eine Route überprüfen, und danach wie gewohnt fortverfahren, da ja der Lesezeiger um ein char weitergerückt ist,
und falls != "#" mit dem Lesezeiger wieder um ein Zeichen zurückzugehen.Das ist eine Möglichkeit. Für die Umsetzung brauchst du die Methode putback.
Am Beispiel:
void readData(std::istream& is) { for (char c; is.get(c); ) { if (c != '#') is.putback(c); double x, y; if (! (is >> x >> y) ) break; is >> ws; // restlichen Whitespace in der Zeile ignorieren (z.B. '\n') cout << x << " " << y << endl; } }
-
Also, danke dir für die Antwort, sie trifft verdammt gut den Punkt!

Das mit dem Whitespace ist scheinbar tatsächlich ein Problem. Ich versteh nur nicht woher das kommt. Denn ich dachte immer bisher, dass der >> operator ohnehin allen möglichen Whitespace ('\t', '\n' etc.) einfach ignoriert und den Lesezeiger auf den nächsten "normalen" character lenkt.
Wie kann es denn dann sein, dass er whitespace einliest?Eigentlich ist der Aufbau der Datei etwas komplizierter, z.B.:
#1
#6 5
1.1 1.4Wenn ich diese 3-Zeiler Datei nun folgendermaßen einlese...
ReadGridData(ifstream &is){ int myNumberOfBlocks; char ch; double X, Y; is.get(ch); if (ch != '#'){ is.putback(ch); } is >> myNumberOfBlocks; if (ch != '#'){ is.putback(ch); } is >> X; is.get(ch); if (ch != '#'){ is.putback(ch); } is >> Y; }...liest er myNumberOfBlocks noch korrekt ein, aber schon beim X schreibt er blödsinn (whitespace).

Wie kann das sein wenn nach
is >> myNumberOfBlocks;
doch in diesem Falle automatisch zum Anfang ('#') der 2. Zeile gesprungen sein müsste?Gruß,
GiantGeorge
-
Wenn DU mit get liest, dann liest er aber Zeichenweise und dann werden auch keine Leerzeichen übersprungen.
-
Hmmm ja,
sorry wenn ich mich grad wie der letzte Depp anstell, aber nach dem get kommt ja sofort ein >> und nach dem
is >> myNumberOfBlocks;
z.B. müsste er doch das ganze whitespace-zeugs übergehen und direkt am Beginn der 2. Zeile stehen oder nicht ?
-
Hi,
kannst du nicht getline für deine Lesemethe verwenden? Wäre hier doch mehr als angebracht.
-
GiantGeorge schrieb:
Hmmm ja,
sorry wenn ich mich grad wie der letzte Depp anstell, aber nach dem get kommt ja sofort ein >> und nach dem
is >> myNumberOfBlocks;Ja, nach dem get funktioniert das schon. Nur mit get willste ja das erste Zeichen der neuen Zeile lesen. Dazu muß der Lesezeiger aber auch dort stehen und nicht in der vorigen Zeile vor irgendeinem Leerzeichen oder dem newline.
-
Wie wär's denn damit:
Jede Zeile mit getline in einen String, gegebenenfalls das Kommentarzeichen entfernen (durch Leerzeichen ersetzen), String in Stringstream, Doubles aus dem Stringstream lesen.
-
ahh fantastisch !
hab mich jetzt doch für die >> ws methode entschieden, aber vielen Dank für alle Beiträge !

-
MFK schrieb:
Wie wär's denn damit:
Jede Zeile mit getline in einen String, gegebenenfalls das Kommentarzeichen entfernen (durch Leerzeichen ersetzen), String in Stringstream, Doubles aus dem Stringstream lesen.
Jo, wir könnten es auch zwischendrin nochmal in ne Datei schreiben... oder über's Netz versenden oder so.