Nur bestimmte Stellen auslesen?
-
a) ist die Datei lang genug?
b) womöglich steht dat noch im Ausgabepuffer - cout schreibt erst auf den Bildschirm, wenn der Puffer voll ist (oder du ihn entleerst, z.B. mit "cout<<endl;").
-
Ja die Datei wäre lang genung. Sie hat 274 Zeichen und mit endl oder .flush() funktioniert es auch nicht. Was kann ich denn da noch machen?
-
flip schrieb:
Was kann ich denn da noch machen?
Breakpoint setzen und den Debugger fragen, was in den verwendeten Variablen landet.
-
Oh mann ich blicks echt nicht mehr,
du kann ich die seek funktion auch benutzen wenn ich mir den ganzen Dateiinhalt in ein array reinschreibe?
Wie lautet denn dann der Code?Vielen Dank
-
vector<char> filedata; ifstream file("daten.txt",ios::in|ios::binary); char ch; while(file.get(ch)) filedata.push_back(ch);
Das liest den kompletten Dateiinhalt in den vector (dynamisches Array) 'filedata' - anschließend kannst du dort beliebig vor und zurück laufen und mit den einzelnen Elementen arbeiten
Um einen Teilbereich zu betrachten, kannst du entweder direkt Pointer in die Daten verwenden oder den Bereich rauskopieren:
char data[7]={0}; copy(filedata.begin()+9,filedata.begin()+15,data);
-
Ok, cool, vielen Dank.
Sind dann eigentlich die Leerstellen weg wenn ich das so einlese? Das wäre nämlich cool
-
Nein, mit dem obigen Code steht genau das selbe im Vektor, was vorher in deiner Datei stand - inklusive aller Leerzeichen und Steuerzeichen. Je nach Dateistruktur könntest du die Daten auch strukturiert auslesen und zwischenlagern:
struct person { string name,vorname; double gehalt; bool geschlecht; ... }; vector<person> Liste; ifstream file("liste.txt"); while(file) { person p;char g; file>>p.name>>p.vorname>>p.gehalt>>g; p.geschlecht=(g=='m'||g=='M'); ... //edit: Das hatte ich wohl unterschlagen: Liste.push_back(p); }
(wie das bei dir aussehen muß, hängt vom tatsächlichen Aufbau der Datei ab, die du einlesen willst)
-
guten morgen,
kannst du mir nochmal weiterhelfen und zwar müsste ich jetzt die arrays in die ich die werte geschriegen habe in eine txt datei schreiben.
Geht das?
kannst du mir hier bitte auch nochmal den code sagen?vielen dank
-
Ja, klar geht das (jetzt am Beispiel der obigen struct person demonstriert):
ofstream fout("out_liste.dat"); for(int i=0;i<Liste.size();++i) fout<<Liste[i].name<<' '<<Liste[i].vorname<<' '<<Liste[i].gehalt<<' '<<(Liste[i].geschlecht)?'M':'W'<<...<<endl;
(achte vor allem auf die Trennzeichen zwischen den einzelnen Elementen, sonst kannst du sie später nicht mehr auseinandernehmen.
Die etwas komplexere Lösung wäre es, den Ausgabe-Operator zu überladen:
ostream& operator<<(ostream& out, const person& p) { out<<p.name<<' '<<p.vorname<<' '<<...; return out; } ... for(int i=0;i<Liste.size();++i) fout<<Liste[i]<<endl;
-
Ok,
vielen Dank schon mal.
Aber ich les es doch so:char datum[7];
file.seekg(115);//Ziel ansteuern
file.read(datum,6);//Daten auslesen
datum[6]='\0';ein. Wie kann ich denn da das Datum in ne Datei schreiben?
-
Ah ja, dann mußt du das genau umgekehrt machen - seekp() setzt den Schreibzeiger der Datei (wenn erforderlich), write() schreibt die Daten.
-
Sorry das ich schon wieder nerv,
aber könntest Du mir bitte ein konretes Beispiel geben.
Ich blicks heut noch nicht. War gestern auf dem Fasching. Sorry
-
Na gut, weil du's bist:
char data[7]; ...//data mit Werten füllen file.seekp(115); //Ziel ansteuern file.write(data,6);//Daten schreiben
-
Super, vielen Dank
Bist ne Wucht!
-
Irgendwie muß ich ja beweisen, daß ich meinen Posten zu Recht bekommen habe
-
so jetzt bin ichs nochmal,
und zwar lese ich mit ner schleife meine werte ein und gib sie aus. das problem ist ja das jedesmal die datei neu angelegt wird und meine werte dann überschrieben werden.
Wie kann ich denn des abfangen?
-
Du mußt die Datei nur einmal vor Beginn der Schleife öffnen und während der Arbeit geöffnet lassen
(ist neben dem Effekt, daß ofstream per Default eine "frische" Datei anlegt, auch deutlich schneller)
Wenn du an mehreren Stellen des Programms schreiben willst, kannst du auch die Datei zum Anhängen öffnen:
ofstream fout("daten.dat",ios::out/*Ausgabe*/ | ios::append/*füge an vorhandene Daten an*/);
-
ok, hab schon wieder zwei probleme und zwar wenn ich den stream in der main(die schleife ist eigene funktion) öffne dann sagt er unbekannter bezeichner obwohl er ihn ja kennen müsste und append ist auch ein nichtdeklarierter Bezeichner.
-
flip schrieb:
ok, hab schon wieder zwei probleme und zwar wenn ich den stream in der main(die schleife ist eigene funktion) öffne dann sagt er unbekannter bezeichner obwohl er ihn ja kennen müsste
Ja, wenn du den Stream in der main deklarierst, ist er lokal zur main() - d.h. du müsstest ihn per Parameter an deine Funktion weitergeben (Referenz).
und append ist auch ein nichtdeklarierter Bezeichner.
*an den Kopf greift* Sorry, der heißt "ios::app"
-
Hi,
ich bins nochmal. Also klappt soweit ganz gut. Nur schreibt er mir jetzt alles zusammen. Was kann ich denn machen das er mir z.B. 5 Zeichen zwischen den Werten frei lässt?
Vg