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;
    }
    

Anmelden zum Antworten