miniu Temat założony przez niniejszego użytkownika |
zapis tablicy typu struktura do pliku binarnego i odczyt » 2015-01-11 20:34:20 Witam, jestem w trakcie pisania mojej pierwszej gry 2d w konsoli, zatrzymałem się na próbie zapisania tablicy struktury do pliku. Oto fragment programu. #pragma hdrstop #include <iostream> #include <stdio.h> #include <conio.h> #include <fstream> using namespace std; struct SScore { string name; int score; };
main() { SScore Wyn[ 6 ]; if( 1 ) { Wyn[ 3 ].name = "zazul"; Wyn[ 3 ].score = 0; Wyn[ 1 ].name = "abdul"; Wyn[ 1 ].score = 11; Wyn[ 0 ].name = "poczatek"; Wyn[ 0 ].score = 4; Wyn[ 5 ].name = "ala"; Wyn[ 5 ].score = 5; Wyn[ 4 ].name = "tyty"; Wyn[ 4 ].score = 4; } std::ofstream plik2; plik2.open( "score5.dat", ios::out | ios::binary ); plik2.write(( char * ) & Wyn, sizeof( struct SScore ) ); plik2.close(); Wyn[ 4 ].score = 1; std::ifstream plik3; plik3.open( "score5.dat", ios::binary | ios::in ); cout << "otworzylo :" << plik3.good() << endl; plik3.read(( char * ) & Wyn, sizeof( struct SScore ) ); plik3.close(); cout << Wyn[ 4 ].score; getch(); }
Problem jest w tym ze w przy tak napisanym kodzie zmienna „Wyn „ nie zostaje pobrana z pliku Gdzie tkwi błąd? A może jest lepszy problem do przechowywania struktury w pliku podczas wczytywania gry. Bardzo proszę o pomoc i wyrozumiałość |
|
alixir |
» 2015-01-12 07:58:46 Po pierwsze zapisujesz do pliku tylko pierwszą wartość tablicy. Prawidłowo zapis powinien wyglądać tak (wegług mnie): plik2.write(( char * ) Wyn, sizeof( Wyn ) ); Oczywiście sizeof( Wyn ) możesz zastąpić zapisem ROZM_TAB * sizeof( SScore ) Co do wczytywania - identyczny problem. Pobierasz tylko jedną strukturę do tablicy. Spróbuj tak: plik3.read(( char * ) Wyn, sizeof( Wyn ) ); lub .. jeśli nie jesteś pewny ile rekordów znajduje się w pliku możesz zczytywać je pojedyńczo, pamiętając jednak o tym by nie przepełnić tablicy (czego nie ma w przykładzie): int wczytano_wpisow = 0; while( plik3.read(( char * ) & Wyn[ wczytano_wpisow ], sizeof( struct SScore ) ) ) wczytano_wpisow++; |
|
Monika90 |
» 2015-01-12 08:17:29 Taką prymitywną metodą nie można zapisywać i odczytywać struktur które zawierają std::string. |
|
miniu Temat założony przez niniejszego użytkownika |
» 2015-01-12 18:16:12 Dziękuję za szybką odpowiedz Kolego „alixir” lecz problem pozostaję dalej nierozwiązany. Uwzględniłem Twoje sugestie i napisałem następujący kod: Wyn[ 4 ].score = 4; std::ofstream plik2; plik2.open( "score5.dat", ios::out | ios::binary ); cout << "otworzono: " << plik2.good() << endl; plik2.write(( char * ) Wyn, sizeof( struct SScore ) ); plik2.close();
cout <<( Wyn[ 4 ].score = 1 ) << endl;
std::ifstream plik3; plik3.open( "score5.dat", ios::binary | ios::in ); cout << "otworzono: " << plik3.good() << endl; int wczytano_wpisow = 0; while( plik3.read(( char * ) & Wyn[ wczytano_wpisow ], sizeof( struct SScore ) ) ) wczytano_wpisow++;
plik3.close(); cout << Wyn[ 4 ].score << endl; dlaczego nie 1 ?
|
|
miniu Temat założony przez niniejszego użytkownika |
» 2015-01-14 19:40:28 brak już konstruktywnych pomysłów? :( |
|
alixir |
» 2015-01-14 20:03:37 Widocznie słabo analizowałeś, bo wyraźnie napisałem plik2.write(( char * ) Wyn, sizeof( Wyn ) ); |
|
miniu Temat założony przez niniejszego użytkownika |
» 2015-01-15 19:22:29 działa :) dzięki "alixir" działa :) dzięki "alixir" Jeżeli nie nadużyję cierpliwości mogę się zapytać dopytać jeszcze .... dlaczego jak program wykonuję ten kod zapis potem odczyt jest ws. ok. std::ofstream plik2; plik2.open( "score13.dat", ios::out | ios::binary ); cout << "otworzono: " << plik2.good() << endl; plik2.write(( char * ) Wyn, sizeof( Wyn ) ); plik2.close();
Wyn[ 4 ].score = 2;
std::ifstream plik3; plik3.open( "score13.dat", ios::binary | ios::in ); cout << "otworzono: " << plik3.good() << endl; int wczytano_wpisow = 0; while( plik3.read(( char * ) & Wyn[ wczytano_wpisow ], sizeof( struct SScore ) ) ) wczytano_wpisow++;
plik3.close();
ale jeżli wywołam sam kod Wyn[ 4 ].score = 2; std::ifstream plik3; plik3.open( "score13.dat", ios::binary | ios::in ); cout << "otworzono: " << plik3.good() << endl; int wczytano_wpisow = 0; while( plik3.read(( char * ) & Wyn[ wczytano_wpisow ], sizeof( struct SScore ) ) ) wczytano_wpisow++;
plik3.close();
wyskakuję błąd programu....? |
|
pekfos |
» 2015-01-15 19:24:35 Taką prymitywną metodą nie można zapisywać i odczytywać struktur które zawierają std::string. |
Później się zorientuje ;) |
|
« 1 » 2 3 |