Zapis i odczyt struktury do pliku

0
struct MyStruct
{
    MyStruct(int l1, int l2) : liczba1(l1), liczba2(l2) {};
    int liczba1;
    int liczba2;
};

        MyStruct obiekt(11,22);
        ofstream plikOUT;
        plikOUT.open("out.bin", ios::binary | ios::out);
        plikOUT.write((const char*)&obiekt, sizeof(MyStruct));
        plikOUT.close();

    
        ifstream plikIN;
        plikIN.open("out.bin", ios::binary | ios::in);
        char* bufor = new char[sizeof(MyStruct)];
        plikIN.read((char*)&bufor, sizeof(bufor));
        MyStruct* tmp = (MyStruct*)(&bufor);
        cout << tmp->liczba1 << tmp->liczba2 << endl;
        plikIN.close();

Poprawnie wczytuje mi z pliku tylko pierwszą liczbę. Druga to przypadkowa wartość. Co robię nie tak?

0

(MyStruct*)(&bufor);
Castujesz adres wskaźnika, co jest bez sensu (i jest UB).

Ogółem utwórz sobie obiekt i do niego wczytuj - jeśli musisz. Inaczej potkniesz się o alignment i UB.

0

Czyli tak?

        ifstream plikIN;
        MyStruct bufor;
        plikIN.open("out.bin", ios::binary | ios::in);
        plikIN.read((char*)&bufor, sizeof(bufor));
        cout << bufor.liczba1 << bufor.liczba2 << endl;
        plikIN.close();

0

Tak

0
didzni napisał(a):

Poprawnie wczytuje mi z pliku tylko pierwszą liczbę. Druga to przypadkowa wartość. Co robię nie tak?

Tak konkretnie to:

        char* bufor = new char[sizeof(MyStruct)];
        plikIN.read((char*)&bufor, sizeof(bufor));

bufor to wskaźnik, więc sizeof(bufor) zwraca ci wielkość wskaźnika a nie wielkość tego na co wskazuje.
Przyjmując, że kompilujesz na 32bit: sizeof(char*) = 4, sizeof(MyStruct) = 8. Wczytujesz cztery bajty zamiast ośmiu. Zagadka rozwiązana.

0

Zgadza się. Dziękuję za podpowiedź.

1 użytkowników online, w tym zalogowanych: 0, gości: 1