lesen aus datei: kombination von operator>>() und getline()
-
hi,
ich habe eine datei mit bspw. 3 werten in der ersten zeile und einem string in der zweiten.
aber nachdem ich datei>>x>>y>>z; benutze, funktioniert die getline()-funktion nicht mehr richtig.#include <iostream> #include <fstream> using namespace std; int main() { int x,y,z; char test[100]; ifstream datei("test.txt"); datei>>x>>y>>z; datei.getline(test,sizeof(test)); cout<<x<<" "<<y<<" "<<z<<endl; //funktioniert cout<<test; //wird nichts ausgegeben! datei.close(); system("PAUSE"); return 0; }die test.txt sieht so aus:
1 2 3 das ist ein test [...]wie kann ich in einer datei also erst mit operator>> zahlenwerte einlesen (wovon mehrere in einer zeile stehen) und dann ganze zeilen als char[] ?
-
warum char[]
nutz doch std::string!
außerdem:
datei>>x>>y>>z;
du bist also noch in der ersten zeile - und machst jetzt nen getline... bekommst also vermutlich nen leeren string...wieso ist die datei so komisch aufgebaut und so weiter... erzähl ma bissl was über den hintergrund...
bb
-
unskilled schrieb:
wieso ist die datei so komisch aufgebaut und so weiter... erzähl ma bissl was über den hintergrund...
sie ist so aufgebaut, weil wertepaare zeilenweise geordnet dadrin stehen sollen
z.b.name des ersten objekts koordinate_x koo_y koo_z farbkomponente_r farbe_g farbe_b name des zweiten objekts ...für die ganzen zahlenwerte ist dann halt >> praktischer, und für die stringzeilen getline()
std::string würde auch gehen, aber momentan benutze ich im programm für den objekttitel char*. daher wird ein char-wert gebraucht.
-
sorry für doppelpost. hab noch was vergessen.
unskilled schrieb:
außerdem:
datei>>x>>y>>z;
du bist also noch in der ersten zeile - und machst jetzt nen getline... bekommst also vermutlich nen leeren string...wie geh ich also an den anfang der nächsten zeile?
hab schon seekg(tellg()+1) und varianten probiert, aber ohne erfolg.
hab mit c++-dateiverarbeitung noch nich soviel erfahrung, bisher eher in C. wollt mich mal upgraden
-
also zu allererst solltest du mal char* verbannen und mit std::string arbeiten...
bei dem problem, dass du noch in der zeile bist kann ich dir auch nicht so richtig weiterhelfen - aber nen getline() vor dem eigtl getline() würde da abhilfe schaffen - wenns auch nicht gerad sehr elegant wäre...
name des ersten objekts koordinate_x koo_y koo_z farbkomponente_r farbe_g farbe_bWarum nicht so:
koo_x koo_y koo_z farb_r farb_g farb_b name des objektsda hat man den name des objektes zwar nicht mehr als erstes aber man hätte zumindest genau eine zeile pro eintrag...
aber wenn man bei deinem ansatz mit
name des ersten objekts koordinate_x koo_y koo_z farbkomponente_r farbe_g farbe_bbleibt, dann würde man doch eh zu erst das std::getline haben?! und dann erst den operator >>
btw. klingt das so, als ob die daten zusammengehören würden... wäre natürlich besser, wenn du ne klasse draus machen würdest und die operatoren >> und << überlädst... dann hättest du nur noch das datei öffnen und schließen in der main drin...
bb
-
unskilled schrieb:
aber wenn man bei deinem ansatz mit
name des ersten objekts koordinate_x koo_y koo_z farbkomponente_r farbe_g farbe_bbleibt, dann würde man doch eh zu erst das std::getline haben?! und dann erst den operator >>
vor dem 1. datensatz stehen globale einstellungen (fullscreenflag, bildgröße, kameraposition, ...).
die idee, das einlesen als klassenfunktion zu machen ist gut. aber da komme ich ja nicht drumherum, den cursor an den anfang der nächsten zeile zu setzen.
zweimal hintereinander getline() funktioniert übrigens - aber ich geb dir recht, dass dss nicht sehr elegant ist

das layout der datendatei möchte ich nicht ändern, weil da noch ein kleiner rattenschwanz dranhängt (ein anderes programm zum editieren derselben, außerdem müsste ich dann noch alle dateien konvertieren usw.).