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

zapis tablicy typu struktura do pliku binarnego i odczyt

Ostatnio zmodyfikowano 2015-01-29 16:39
Autor Wiadomość
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. 

C/C++
#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; //  pisanie
    plik2.open( "score5.dat", ios::out | ios::binary );
    //plik2.seekp(0);
    plik2.write(( char * ) & Wyn, sizeof( struct SScore ) );
    plik2.close();
   
    Wyn[ 4 ].score = 1;
   
    std::ifstream plik3; // czytanie
    plik3.open( "score5.dat", ios::binary | ios::in );
    cout << "otworzylo :" << plik3.good() << endl;
    //plik3.seekg(0);
    plik3.read(( char * ) & Wyn, sizeof( struct SScore ) );
    plik3.close();
   
    cout << Wyn[ 4 ].score; // powinno być "4"
    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ść


P-124683
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):
C/C++
int wczytano_wpisow = 0;
while( plik3.read(( char * ) & Wyn[ wczytano_wpisow ], sizeof( struct SScore ) ) )
     wczytano_wpisow++;
P-124703
Monika90
» 2015-01-12 08:17:29
Taką prymitywną metodą nie można zapisywać i odczytywać struktur które zawierają std::string.
P-124704
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:

C/C++
Wyn[ 4 ].score = 4;
std::ofstream plik2; //  pisanie
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; // czytanie
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 ?
P-124744
miniu
Temat założony przez niniejszego użytkownika
» 2015-01-14 19:40:28
brak już konstruktywnych pomysłów? :(
P-124932
alixir
» 2015-01-14 20:03:37
Widocznie słabo analizowałeś, bo wyraźnie napisałem
plik2.write(( char * ) Wyn, sizeof( Wyn ) );
P-124937
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.

C/C++
std::ofstream plik2; //  pisanie
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; // czytanie
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

C/C++
Wyn[ 4 ].score = 2;
std::ifstream plik3; // czytanie
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....?

P-124991
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 ;)
P-124993
« 1 » 2 3
  Strona 1 z 3 Następna strona