• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zapisywanie/wyczytwanie tablicy struktur do pliku binarnego

VPS Starter Arubacloud
0 głosów
1,759 wizyt
pytanie zadane 6 lutego 2019 w C i C++ przez kamasazi98 Początkujący (410 p.)

Witam. 
Chciałem poćwiczyć zapis/odczyt z pliku binarnego i w pewnym momencie zrobilem tablice struktur, którą chciałem zapisać w pliku binarnym, a następnie wczytać ją z tego pliku do nowej tablicy i właśnie w tym momencie pojawił się problem. Program jak najbardziej "coś" zapisuje, lecz to "coś" nie jest tym co ja wpisałem. Najprawdopodobniej źle napisałem linijke do zapisu lub wczytania. Mógłby ktoś mi z tym pomóc? 
Poniżej zamieszczam część kodu i screen z konsoli.

void zapis_bin(int n,osoba *baza)
{
    ofstream plik("nazwa.dat",ios::binary|ios::out);

        plik.write(reinterpret_cast<char*>(baza),sizeof(osoba));

    plik.close();
}
void wczytaj_bin(int n,osoba *baza2)
{
    ifstream plik("nazwa.dat",ios::binary|ios::in);
    for(int i=0;;i++)
    {
        plik.read(reinterpret_cast<char*>(baza2),sizeof(osoba));
        if(plik.eof())
            break;
    }
    plik.close();
}

 

1 odpowiedź

+1 głos
odpowiedź 6 lutego 2019 przez criss Mędrzec (172,590 p.)
edycja 6 lutego 2019 przez criss
 
Najlepsza

Po co jest parametr `n`?

W wczytaj_bin zawsze czytasz do tej samej pamięci. Powinno być reinterpret_cast<char*>(baza2+i) lub w po prostu bez pętli

plik.read(reinterpret_cast<char*>(baza2), n*sizeof(osoba));

jeśli baza2 wskazuje do tablicy oraz parametr n oznacza liczbe elementów do wczytania i jednocześnie jest <= rozmiarowi tablicy.

Wątpie jednak, żeby to rozwiązało obecny problem (nie mówię, że na pewno nie bo pokazałeś za mało kodu, ale być może). Jeśli problem nadal będzie, to daj więcej kodu.

komentarz 6 lutego 2019 przez kamasazi98 Początkujący (410 p.)

Parametr "n" był tam, dlatego, że kombinowałem na różne sposoby i wcześniej była tam petla for z warunkiem i<n

Teraz po zastosowaniu się do Twoich zaleceń przepisuje jeden rekord 

To cały kod programu

#include <iostream>
#include <fstream>
using namespace std;
struct osoba
{
    char imie [20];
    int liczby;
};

void ilosc(int &n);
void wpisz_do_bazy(int n,osoba *baza);
void wypisz_z_bazy(int n,osoba *baza,osoba *baza2);
void zapis_bin(osoba *baza);
void wczytaj_bin(int n,osoba *baza2);


int main()
{
    int n;
    ilosc(n);
    osoba *baza=new osoba [n];
    osoba *baza2=new osoba [n];
    wpisz_do_bazy(n,baza);
    zapis_bin(baza);
    wczytaj_bin(n,baza2);
wypisz_z_bazy(n,baza,baza2);
    return 0;
}
void ilosc(int &n)
{
    cout<<"Ile osob chcesz wpisac?: ";
    cin>>n;
}
void wpisz_do_bazy(int n, osoba *baza)
{
    for(int i=0;i<n;i++)
    {
        cout<<"Imie: ";
        cin>>baza[i].imie;
        cout<<"Liczba: ";
        cin>>baza[i].liczby;
    }

}
void wypisz_z_bazy(int n, osoba *baza,osoba *baza2)
{
    cout<<endl<<"baza 1"<<endl;
        for(int i=0;i<n;i++)
    {
        cout<<"Imie: "<<baza[i].imie<<endl;
        cout<<"Liczba: "<<baza[i].liczby<<endl;

    }
    cout<<endl<<"baza 2"<<endl;
            for(int i=0;i<n;i++)
    {
        cout<<"Imie: "<<baza2[i].imie<<endl;
        cout<<"Liczba: "<<baza2[i].liczby<<endl;

    }
}
void zapis_bin(osoba *baza)
{
    ofstream plik("nazwa.dat",ios::binary|ios::out);


        plik.write(reinterpret_cast<char*>(baza),sizeof(osoba));


    plik.close();
}
void wczytaj_bin(int n,osoba *baza2)
{
    ifstream plik("nazwa.dat",ios::binary|ios::in);
    for(int i=0;;i++)
    {
       plik.read(reinterpret_cast<char*>(baza2+i),sizeof(osoba));

        if(plik.eof())
            break;
    }
    plik.close();
}

 

komentarz 6 lutego 2019 przez criss Mędrzec (172,590 p.)

Teraz po zastosowaniu się do Twoich zaleceń przepisuje jeden rekord  

Tzn. działa ok? Nie wiem czy dobrze rozumiem. 

komentarz 6 lutego 2019 przez kamasazi98 Początkujący (410 p.)

No nie do końca, bo jeśli będę chciał wpisać więcej niż 1 to nie przepisuje, wyśle screena z konsoli na nim to jasno widać. Nie wiem czy dobrze, ale wydaje mi się, że to może wina zapisu do pliku?

komentarz 6 lutego 2019 przez criss Mędrzec (172,590 p.)

No ale jak to ma czytać 2 elementy skoro do pliku zapisujesz tylko jeden?

plik.write(reinterpret_cast<char*>(baza),sizeof(osoba));

Zapisuj do pliku n elementów i będzie ok... 

komentarz 6 lutego 2019 przez kamasazi98 Początkujący (410 p.)
Faktycznie mój błąd, dzieki wielkie za pomoc

Podobne pytania

0 głosów
1 odpowiedź 372 wizyt
pytanie zadane 16 marca 2020 w C i C++ przez Quanti994 Początkujący (340 p.)
0 głosów
1 odpowiedź 773 wizyt
0 głosów
2 odpowiedzi 181 wizyt

92,980 zapytań

141,943 odpowiedzi

321,189 komentarzy

62,307 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...