[C++] Zapis tablicy struktur do pliku
Ostatnio zmodyfikowano 2013-02-13 16:37
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: 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ź. |
|
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). |
|
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: 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? 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. |
|
kubawal |
» 2013-02-13 16:37:12 Zmień string'i na tablice char'ów: 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ć? Przecież wbudowane tablice nie mają metody size()! |
|
« 1 » |