fstream: Binär auslesen?
-
Tach,
Ich hab ein Problem mit Binär auslesen. Zwar schreib ich in ein File mit reinterpret_casts entweder nur floats oder nur doubles rein, darum Function-Templates. Also der reinterpret funktioniert. Der erste Wert kann ich einfach auslesen. Aber wie kann ich dann die weiteren Werte auslesen, sprich, auf welche Position muss ich denn FilePointer setzen?
Ich dachte so:
file.seekp((p*sizeof(T))+sizeof(T), ios::beg);
Also wenn ich den 2. Wert möchte ist p=1; Also spring ich p mal die grösse des Wertes weiter und spring noch ein weiteres weiter!?Zudem hab ich noch ein "komischer" Fehler. Wenn ich ein double auslesen möchte, stürtzt mein Programm ab. Bei Floats passiert das nicht.
Für eure Hilfe bin ich sehr dankbar!
PS: Ist nur ein Übungsprogrammchen
Hier der Code:
template<class T> void appendItem(T f) { fstream file; file.open(path, ios::out | ios::binary | ios::app); //WRITE if(!file) cout << "FEHLER!" << endl; else { file.clear(); unsigned char* cp = reinterpret_cast<unsigned char*>(&f); file << cp; } file.close(); } template<class T> void readItem(int p) { fstream file; file.open(path, ios::in | ios::binary); //READ if(!file) cout << "FEHLER!" << endl; else { char c[sizeof(float)+1]; //+1 wegen EOS file.clear(); //Fehlerflag loeschen if(p != 0) file.seekp((p*sizeof(T))+sizeof(T), ios::beg); //FilePointer setzen file.get(c, sizeof(T)+1); T *t = reinterpret_cast<T*>(&c); cout << "found: " << *t << endl; } datei.close(); } int main() { fstream file; file.open(path, ios::out | ios::trunc); //Datei Inhalt loeschen file.close(); appendItem<float>(1245.6789); appendItem<float>(456.6789); readItem<float>(0); readItem<float>(1); //Dieses mal double: file.open(path, ios::out | ios::trunc); //Datei Inhalt loeschen file.close(); appendItem<double>(1245.6789); appendItem<double>(456.6789); readItem<double>(0); readItem<double>(1); //ABSTURZ!?!? return 0; }