• 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

Cloud VPS
0 głosów
1,897 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,570 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,570 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,570 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ź 506 wizyt
pytanie zadane 16 marca 2020 w C i C++ przez Quanti994 Początkujący (340 p.)
0 głosów
1 odpowiedź 1,220 wizyt
0 głosów
2 odpowiedzi 257 wizyt

93,487 zapytań

142,423 odpowiedzi

322,773 komentarzy

62,908 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

Kursy INF.02 i INF.03
...