Filestream schließt vorzeitig
-
hallo, ich hab ederzeit Probleme ein bestimmtes Dateienformat zu lesen, nun habe ich zum Test einmal die gesamte Datei byteweise ausgelesen und bemerkt, dass der Stream vorzeitig EOF ausgibt.
Hier kurz mein code:string filename("kfm.snd"); ifstream myfile(filename.c_str(),ifstream::in); if(myfile.good()) { vector<char> data; while(!myfile.eof()) { char c; myfile.read(&c,sizeof(char)); data.push_back(c); } unsigned int counter = 0; cout << "size: " << data.size()<<endl;Am ende gebe ich die größe von dem Vector aus und das programm gibt mir etwas in höhe von 4000 aus, aber die gesamte datei ist laut explorer größer als 70000 Byte. Scheinbar funktioniert die Leseoperation nicht so wie ich denke.
Was mache ich falsch?!
-
Wie wärs hiermit?
string filename("kfm.snd"); ifstream myfile(filename.c_str()); if(myfile) { vector<char> data; for(char c; myfile >> c;) { data.push_back(c); } cout << "size: " << data.size() << endl; }
-
ich probiere das gleich mal aus, aber macht das nicht das gleiche?
-
Sag mal, besteht diese kfm.snd aus Text?
-
Namenloser342 schrieb:
aber macht das nicht das gleiche?
- Wenn ein Fehler auftritt bringt dir !myfile.eof() relativ wenig.
- Das mit der read-Methode, ich weiß nicht, ich hab sie in der Schule nur fürs Einlesen von Objekten benutzt, die vorher mit der write-Methode serialisiert wurden.
- ios_base::in ist default, das brauchste nicht mit angeben.
- Wofür der counter ist, erschließt sich mir nicht.
-
cooky451 schrieb:
Sag mal, besteht diese kfm.snd aus Text?
Nein, besteht im wesentlichen aus wav daten
-
Namenloser342 schrieb:
cooky451 schrieb:
Sag mal, besteht diese kfm.snd aus Text?
Nein, besteht im wesentlichen aus wav daten
Wie wäre es dann mit std::ios::binary?
-
Gugelmoser schrieb:
Namenloser342 schrieb:
aber macht das nicht das gleiche?
- Wenn ein Fehler auftritt bringt dir !myfile.eof() relativ wenig.
- Das mit der read-Methode, ich weiß nicht, ich hab sie in der Schule nur fürs Einlesen von Objekten benutzt, die vorher mit der write-Methode serialisiert wurden.
- ios_base::in ist default, das brauchste nicht mit angeben.
- Wofür der counter ist, erschließt sich mir nicht.
der Counter zählt eigentlich was anderes was ich aber aus dem code gelösct hab da es für die fehlerfindung unerheblich ist.
-
cooky451 schrieb:
Namenloser342 schrieb:
cooky451 schrieb:
Sag mal, besteht diese kfm.snd aus Text?
Nein, besteht im wesentlichen aus wav daten
Wie wäre es dann mit std::ios::binary?
Haha du hattest recht, daran lag es. VERDAMMT ich hatte vergessen das er standardmäßig als textdatei liest, dachte es wäre andersherum.
Vielen dank, kann zu.
-
Namenloser342 schrieb:
Haha du hattest recht, daran lag es. VERDAMMT ich hatte vergessen das er standardmäßig als textdatei liest, dachte es wäre andersherum.
Vielen dank, kann zu.Gerne.

Aber ein Tipp: Das so zu regeln könnte recht langsam sein, nicht nur wegen des Auslesens, sondern auch weil der std::vector dauernd neuen Speicher braucht.
So könnte man das z.B. auch machen:file.seekg(0, std::ios::end); std::vector<char> buf(static_cast<std::vector<char>::size_type>(file.tellg())); file.seekg(0, std::ios::beg); file.read(&buf[0], buf.size());
-
Danke für den Tipp, nach so einer Variante hatte ich gesucht war mir aber unsicher ob das direkte in den Vektor lesen(also mit dem read) angebracht ist.
Geschwindigkeit spielt aber hier eigentlich kaum eine Rolle(soweit ich das sagen kann), dient halt dem Laden eines Charakters und wenn das ne Sekunde länger dauert ist(zumindest mir) das auch egal.