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

Zapis danych z tablicy struktur do pliku binarnego

Cloud VPS
0 głosów
495 wizyt
pytanie zadane 16 marca 2020 w C i C++ przez Quanti994 Początkujący (340 p.)

Program zapisuje plik,jednak proba odczytania danych z tego pliku konczy sie wyswietleniem imienia z pierwszej struktury i program się sypie wywalając kod błędu: 0xC0000005.

binarDatWorker.cpp

#include "binarDatWorker.h"

void checkSex(dataPerson *n_indi)
{
    int numbSex = n_indi->PESEL[10] - '0'; //W tabeli ASCII wartość znaku 0 jest równa 48. Następne znaki cyfr do 9 mają wartości po kolei 49, 50, ..., 57. Więc gdy odejmiemy od nich wartość znaku 0 (48) to zostanie nam odpowiednia cyfra.
    if(numbSex%2==0) n_indi->sex=FEMALE; else n_indi->sex=MALE;
}

void setPESEL(dataPerson *n_indi)
{
    for(int i=0;i<11;i++)
    {
        n_indi->PESEL[i] = getch();
        cout<<n_indi->PESEL[i];
    }
}

void setPerson(dataPerson *n_indi)
{
    for(int i=0;i<3;i++)
    {
        cout <<"----------------------------------------"<<endl;
        cout <<"Podaj imie pracownika nr "<<i+1<<": ";
        cin >>n_indi->name;
        cout <<"Podaj nazwisko pracownika nr "<<i+1<<": ";
        cin >>n_indi->surname;
        cout <<"Podaj wiek pracownika nr "<<i+1<<": ";
        cin >>n_indi->age;
        cout <<"Podaj PESEL pracownika nr "<<i+1<<": ";
        setPESEL(n_indi);
        checkSex(n_indi);
        cout<<endl;
        n_indi++;
    }

}

void savePerson(dataPerson *n_indi)
{
    ofstream save("database.bin",ios::binary);

    for(int i=0;i<3;i++)
    {
        save.write(n_indi->name.c_str(),n_indi->name.size()+1);
        save.write(n_indi->surname.c_str(),n_indi->surname.size()+1);
        save.write((const char*)&n_indi->age,sizeof n_indi->age);
        for(int j=0; j<10; j++) {save.write(&n_indi->PESEL[j],sizeof n_indi->PESEL[j]);}
        save.write((const char*)&n_indi->sex,sizeof n_indi->sex);
        n_indi++;
    }

    save.close();
}

void loadPerson(dataPerson *n_indi)
{
    ifstream open("database.bin",ios::binary);

    for(int i=0;i<3;i++)
    {
        getline(open,n_indi->name,'\0');
        getline(open,n_indi->surname,'\0');
        open.read((char*)&n_indi->age,sizeof &n_indi->age);
        for(int j=0; j<10; j++) {open.read(&n_indi->PESEL[j],sizeof &n_indi->PESEL[j]);}
        open.read((char*)&n_indi->sex,sizeof &n_indi->sex);
        n_indi++;
    }

    open.close();
}

void getPerson(dataPerson *n_indi)
{
    cout<<"=================================================="<<endl;
    cout<<"LISTA PRACOWNIKOW: "<<endl;

    for(int i=0;i<3;i++)
    {
        cout <<"----------------------------------------"<<endl;
        cout <<"Imie pracownika nr "<<i+1<<": "<<n_indi->name<<endl;
        cout <<"Nazwisko pracownika nr "<<i+1<<": "<<n_indi->surname<<endl;
        cout <<"Wiek pracownika nr "<<i+1<<": "<<n_indi->age<<endl;
        if(n_indi->sex==1) cout <<"Plec pracownika nr "<<i+1<<": Mezczyzna"<<endl; else cout <<"Plec pracownika nr "<<i+1<<": Kobieta"<<endl;
        cout <<"PESEL pracownika nr "<<i+1<<": ";
        for(int i=0;i<11;i++){cout<<n_indi->PESEL[i];}
        cout<<endl;
        n_indi++;
    }
}

binarDatWorker.h

#ifndef BINARDATWORKER_H
#define BINARDATWORKER_H
#include <iostream>
#include <string>
#include <fstream>
#include <conio.h>

using namespace std;

enum SEX {MALE=1,FEMALE=2};

struct dataPerson{
    string name;
    string surname;
    unsigned short age;
    SEX sex;
    char PESEL[11];
};

void checkSex(dataPerson *n_indi);
void setPESEL(dataPerson *n_indi);
void setPerson(dataPerson *n_indi);
void getPerson(dataPerson *n_indi);
void savePerson(dataPerson *n_indi);
void loadPerson(dataPerson *n_indi);

#endif // BINARDATWORKER_H

main.cpp

#include "binarDatWorker.h"

int main()
{
    dataPerson persons[3];
    dataPerson *indi;
    indi = persons;
    setPerson(indi);
    indi = persons;
    savePerson(indi);
    indi = persons;
    loadPerson(indi);
    indi = persons;
    getPerson(indi);

    return 0;
}

 

komentarz 16 marca 2020 przez tkz Nałogowiec (42,060 p.)
W której linii kompilator pokazuje błąd? Zgaduje, że Visual Studio, błąd może, ale nie musi wynikać, z braku copy assignment operator(specjalnie po angielsku, łatwiej będzie szukać). 7 linia, main. Przypisujesz "klasie" inną "klasę".
komentarz 17 marca 2020 przez Quanti994 Początkujący (340 p.)
edycja 17 marca 2020 przez Quanti994
Kompilator błędu nie wywala.Program się sypie,gdy po wprowadzeniu danych pracowników i zapisaniu ich w pliku binarnym ma on następnie wczytać dane z tego pliku do struktur w tablicy i je wyświetlić na ekranie.

W tej 7 linijce ustawiłam wskaźnik na tablicę,aby dla poprawnego funkcjonowania procedur był on ustawiony na 0 element tablicy struktur.

Program pisany w Code Blocks
komentarz 17 marca 2020 przez tkz Nałogowiec (42,060 p.)

Na pewno, to  ifstream open("database.bin",ios::binary); jest do zmiany. 

explicit ifstream (const char* filename, ios_base::openmode mode = ios_base::in);

To jest defultowy konstruktor, Ty go "psujesz" dając tylko ios::binary, spróbuj dodac openmode.

komentarz 17 marca 2020 przez mokrowski Mędrzec (158,840 p.)
Debugger i do dzieła. A jak nie znasz, to dobry case by się nauczyć :)

1 odpowiedź

0 głosów
odpowiedź 17 marca 2020 przez Quanti994 Początkujący (340 p.)

Program działa!

Jeśli ktoś ma podobny problem to wywalanie programu dotyczyło numeru PESEL,gdzie w kodzie z powodu roztargnienia zmniejszyłam go z 11 do 10,oraz błędne użycie operatora sizeof

Źle

open.read((char*)&n_indi->age,sizeof &n_indi->age);
for(int j=0; j<10; j++) {open.read(&n_indi->PESEL[j],sizeof &n_indi->PESEL[j]);}

Dobrze

open.read((char*)&n_indi->age,sizeof n_indi->age);
for(int j=0; j<10; j++) {open.read(&n_indi->PESEL[j],sizeof(char));}

Zamiast wczytać 1 znak wczytywało 4 lub 8.

Dyskusyjne jest rozwiązanie oddzielenia stringów od struktury w celu oddzielnego zapisu PDO i oddzielnego zapisu stringów (rozwiązanie z innego forum),oraz serializacji.

Podobne pytania

0 głosów
1 odpowiedź 1,164 wizyt
0 głosów
1 odpowiedź 1,879 wizyt
pytanie zadane 6 lutego 2019 w C i C++ przez kamasazi98 Początkujący (410 p.)
0 głosów
2 odpowiedzi 242 wizyt

93,456 zapytań

142,451 odpowiedzi

322,721 komentarzy

62,837 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
...