Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Zapis tablicy struktur do pliku

Ostatnio zmodyfikowano 2013-02-13 16:37
Autor Wiadomość
tomektr1
Temat założony przez niniejszego użytkownika
[C++] Zapis tablicy struktur do pliku
» 2013-02-12 17:14:36
Witam!

Jako początkujący programista, po raz kolejny napotykam się na problem i dlatego zwracam się do Was z prośbą o pomoc.

Piszę sobie programik, który w pewnym momencie musi zapisać dane użytkowników do pliku. Dane te są w postaci struktury danych i chciałbym je sobie ładnie i szybko wczytywać do pliku. :)
Napisałem więc taki fragment kodu, który ma zapisywać dane:

C/C++
void Zapisz( Uzytkownicy user[] ) {
   
    fstream dane;
    dane.open( "users.dat", ios::trunc | ios::binary );
   
    if( dane.good() ) {
        dane.write( & user[ 0 ], user.size() );
        dane.close();
    }
    else cout << endl << "BLAD ODCZYTU";
   
}

Szukałem już troszeczkę informacji o tym, ale niestety nigdzie nie mogę tego znaleźć opisanego w przejrzysty sposob. Mi się wydaję, że problem jest z "size()", bo pewnie działa to tylko do napisów. Jeśli tak, to co podać jako drugi parametr "write()"? Albo jak zrobić to w inny sposób?

Z góry dzięki za odpowiedź.
P-76197
DejaVu
» 2013-02-12 21:00:05
Kwestia jakie dane chcesz zapisać i jak wygląda struktura. Jeżeli chcesz zapisać obiekty np. std::string to musisz napisać sobie mechanizm 'serializujący' i 'deserializujący' dane. Oznacza to, że najpierw np. zapisujesz do pliku długość tekstu, a potem dopiero określoną liczbę znaków. Przy odczytywaniu tekstu najpierw wczytujesz jego długość, rezerwujesz pamięć, a następnie wczytujesz określoną liczbę znaków. W przypadku typów prostych wystarczy dać przy odczytywaniu jak i zapisywaniu sizeof(typ_danych).
P-76220
tomektr1
Temat założony przez niniejszego użytkownika
» 2013-02-13 10:31:44
No to sprawa mi się komplikuje niestety (albo i stety, bo więcej się naucze), bo w strukturze mam dwa stringi. Teraz już wiem skąd moje niepowodzenia, przy używaniu "sizeof()". Struktura wygląda dokładnie tak:

C/C++
struct Uzytkownicy {
    string nick;
    string haslo;
    bool admin;
    bool zarejestrowany;
};

Ale ciągnąc temat dalej, jak stworzyć ten mechanizm serializujący? Wczytywać do pliku funkcją "write()" poszczególne pola struktury oddzielnie? Coś mniej więcej w tym stylu?

C/C++
void Zapisz( Uzytkownicy user[] ) {
   
    fstream dane;
    dane.open( "users.dat", ios::trunc | ios::binary );
   
    if( dane.good() ) {
       
        for( int i = 0; i < 10; i++ ) {
            dane.write( user[ i ].nick, user[ i ].nick.size() );
            dane.write( user[ i ].haslo, user[ i ].haslo.size() );
            dane.write( user[ i ].admin, 1 );
            dane.write( user[ i ].zarejestrowany, 1 );
        }
       
        dane.close();
    }
    else cout << "BLAD";
   
}

Niestety to rozwiązanie też nie działa.
P-76224
kubawal
» 2013-02-13 16:37:12
Zmień string'i na tablice char'ów:

C/C++
const int max_nazwa = 40;
const int max_haslo = 40;

struct Uzytkownicy
{
    char nazwa[ max_nazwa ];
    char haslo[ max_haslo ];
    //...
};

//...
plik.write( & user, sizeof( user ) );
Wtedy wszystko Ci się pięknie poukłada, tylko długości tych c-stringów nie mogą przekraczać odpowiednich wartości!

/edit:
Co to ma być?
user.size()
Przecież wbudowane tablice nie mają metody size()!

P-76235
« 1 »
  Strona 1 z 1