read()..
-
ich habe mal ein simples program geschrieben das, einfach etwas in eine binäre datei schreibt und wieder raus liest.
Doch beim rauslesen scheint ein bug zu sein : \#include<fstream.h> int main(){ char string[]="hallo",red[5]; ofstream eing; eing.open("test.bin",ios::binary); eing.write(string,5); ifstream ausg("test,bin",ios::binary); ausg.read(red,5); cout<<string<<endl<<red<<endl; return 0; }
beim ausgeben von red gibt er zuerst 8 mal ╠ also NULL aus und dann erst hallo,
wieso ist das so?
-
erstens stimmen die beiden Dateinamen nicht überein, und zweitens solltest du die Datei schließen oder flushen, damit sie auf die Platte geschrieben wird, bevor du sie zum Lesen öffnest.
-
Ups, ^^'
stimmt beim zweiten ist test,bin.
Naja, aber es ist trotzdem das selbe, jetzt heißen beide gleich und ich habe die datei vor dem lesen geschlossen, aber tzrotzdem kommt das selbe raus
-
Bei mir gehts. Natürlich kommt nach hallo noch jede Menge Schrott, weil der String nicht nullterminiert ist. Aber *davor* kommt nichts.
-
was ist nullterminiert?
-
Durch eine '\0' abgeschlossen. "hallo" z.B. sind eigentlich 6 Zeichen. h bis o und ein \0. Wenn du das ausgibst, stoppt die Ausgabe bei der \0. Dein red enthält aber nur 5 Zeichen, die \0 fehlt. Also wird solange ausgegeben, bis im Speicher zufällig ein \0 kommt.
-
string hat ja auch 5 string[5] von 0 bis 4 kann man chars speichern also das hallo und im 5 ist dann NULL,
bei red ist es doch auch so, beim 5 ist dann das "\0".
Also kann es doch nicht daran liegen oder?
-
ß.ß schrieb:
string hat ja auch 5 string[5] von 0 bis 4
von 0 bis 4 sinds schon 5 elemente.
string hat aber 6 wegen "hallo\0"
'\0' definiert das ende des stringsred[5] hat nur 5 elemente und da passt das '\0' nicht mehr rein.
also
char red[6];
und
ausg.read(red,5); red[5] = 0;
mfg higret
-
axo ^^'
-
noch was, wie kann ich die datei öffnen ohne sie immer zu überschreiben?
-
hi
mit ios::app wie append (anhängen)
für weitere fragen empfehle ich
http://www.cppreference.com/mfg higret
-
Wie kann man abfragen ob eien datei bereits exestiert, ich finder überall nur:
ifstream inputStream("file.txt"); if( !inputStream ) { cerr << "Error opening input stream" << endl; return; }
Dies ist aber ein ziemlicher schwachsinn, da zuerst die Datei file.txt erzeugt wird und dan abgefragt wird ob es die schon gibt : \
-
bei ifstream wird keine datei erzeugt, aber das versagen des öffnens kann auch damit zutun haben, dass man keine rechte zum lesen der datei hat.
-
nein die rechte hat es es shcon, allerdings funktioniert die abfrage nicht..
-
Auf die Gefahr hin, dass ich jetzt verbrannt und geköpft werde (
), du kannst mal schauen ob deine STL-Implementierung das Flag ios::Nocreate, oder ein ähnliches mit der gleichen Funktion besitzt, damit verhinderst du, dass eine neue Datei erzeugt wird.