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

C++ Zapis / Odczytem vektor<unsigned> do pliku binarnego

Ostatnio zmodyfikowano 2014-08-03 23:37
Autor Wiadomość
Haker123
Temat założony przez niniejszego użytkownika
C++ Zapis / Odczytem vektor<unsigned> do pliku binarnego
» 2014-07-30 19:09:27
Witam.

Mam problem z zapisem i odczytem vektora<unsigned> do pliku binarnego.
Za kazdym razem przy odczycie mam smieci ktorych nie powinno tam byc.

Kombinowalem na wiele sposobow i nic mi nie wychodzi.

Obecnie kod wyglada tak.
C/C++
for( int i = 0; i < 10; i++ )
     File.write( reinterpret_cast < char *>( & Top10_Points[ i ] ),( sizeof( Top10_Points.size() ) * sizeof( unsigned ) ) );


Wpisywalem rowniez sizeof(Top10_Points) //// sizeof(Top10_Points) * sizeof(unsigned) i inne podobne zapisy ktore wpadly mi do glowy (wiem ze strzelalem na slepo ale to bylo lepsze niz siedzenie i modlenie sie przed monitorem ;] )

Top10_Points to vektro<unsigned> ktory posiada 10 elementow.

Odczyt wyglada tak samo.
P-114680
1aam2am1
» 2014-07-30 19:24:49
Po pierwsze jakiej biblioteki używasz do obsługi plików?
Po drugie zapisuje binarnie jeżeli używasz fstream
Po trzecie zastosuj coś w rodzaju symbolu znaku np nowej linii czy jakiegokolwiek znacznika który będzie oddzielał dane od siebie.
P-114681
pekfos
» 2014-07-30 19:42:17
Po pierwsze jakiej biblioteki używasz do obsługi plików?
Wygląda na standardową.

Po trzecie zastosuj coś w rodzaju symbolu znaku np nowej linii czy jakiegokolwiek znacznika który będzie oddzielał dane od siebie.
Po co? To dane o stałym rozmiarze.

C/C++
( sizeof( Top10_Points.size() )
Co.. to.. mabyć..? size() to już twój rozmiar, a ty próbujesz wyciągnąć rozmiar rozmiaru, który nie ma nic wspólnego z ilością danych w wektorze.

Za kazdym razem przy odczycie mam smieci ktorych nie powinno tam byc.
Tzn..? Nie ma kodu, nie ma problemu..
P-114684
Monika90
» 2014-07-30 19:47:50
zapis

file.write(static_cast<const char*>(static_cast<const void*>(vec.data())),
    vec.size() * sizeof(vec[0]));


odczyt

vec.resize(10);
file.read(static_cast<char*>(static_cast<void*>(vec.data())),
    vec.size() * sizeof(vec[0]));


ale nie wiem czy to jest poprawne, używaj na własne ryzyko...
P-114686
1aam2am1
» 2014-07-30 19:56:26
Wygląda na standardową?
C/C++
#include <fstream> //classa fstream
#include <stdio.h> //classa FILE
Która standardowa? Bo dla mnie ta pierwsza.
vektor<typ> typ nie musi mieć stałego rozmiaru np string, lub inna rzecz mająca np tablice o nieznanym rozmiarze podczas kompilacji.

Edit.

Unsigned ma rozmiar?
To przecież oznacza bez znaku, czyli liczba jest tylko dodatnia.
P-114687
pekfos
» 2014-07-30 19:59:20
Która standardowa? Bo dla mnie ta pierwsza.
Obie.

vektora<unsigned> np unsigned to std::string standardowy rozmiar nie wydaje mi się.
?
vektor<typ> typ nie musi mieć stałego rozmiaru np string, lub inna rzecz mająca np tablice o nieznanym rozmiarze podczas kompilacji.
Ale unsigned ma stały rozmiar. Wykluczasz te rozwiązanie, bo dla jakiegoś innego typu nie będzie działać..?
Unsigned ma rozmiar?
To przecież oznacza bez znaku, czyli liczba jest tylko dodatnia.
unsigned = unsigned int.
P-114689
Haker123
Temat założony przez niniejszego użytkownika
» 2014-07-31 22:49:19
Kod zapisu danych do pliku wyglada tak
C/C++
bool Map::Save_Map( ALLEGRO_DISPLAY * display )
{
    ///OTWIERAMY PLIK DO ZAPISU BINARNEGO
    std::ofstream File( File_Name.c_str(), std::ios::out | std::ios::binary );
    //std::cout << "11111" << std::endl ;
    if( !File )
    {
        //std::cout << "22222" << std::endl ;
        al_show_native_message_box( display, "MAP ERROR", "ERROR", "You can not save the map", NULL, ALLEGRO_MESSAGEBOX_ERROR );
        return false;
    }
   
    //std::cout << "33333" << std::endl ;
    int What[ 400 ];
   
    for( int y = 0; y < 400; y++ )
    {
        //Screen_Map[ y * 20 + x ]
        //std::cout << "44444" << std::endl ;
        //for(int x = 0 ; x < 20 ; x++)
        //{
        //PUSTE MIEJSCE 1
        if( Screen_Map[ y ] == Elements[ 15 ] )
        {
            //std::cout << "44411" << std::endl ;
            What[ y ] = 1;
            //File.write( reinterpret_cast<const char*>(&What) , sizeof(char) ) ;
        }
        //SCIANA 2
        else if( Screen_Map[ y ] == Elements[ 16 ] )
        {
            //std::cout << "44422" << std::endl ;
            What[ y ] = 2;
            //File.write( (char*) &What , sizeof(int) ) ;
        }
        //GLOWA WEZA  -[] 3
        else if(( Screen_Map[ y ] == Elements[ 0 ] ) ||( Screen_Map[ y ] == Elements[ 1 ] ) ||
        ( Screen_Map[ y ] == Elements[ 2 ] ) ||( Screen_Map[ y ] == Elements[ 3 ] ) )
        {
            //std::cout << "44433" << std::endl ;
            What[ y ] = 3;
            //File.write( (char*) &What , sizeof(int) ) ;
        }
        //OGON WEZA []-  4
        else if(( Screen_Map[ y ] == Elements[ 8 ] ) ||( Screen_Map[ y ] == Elements[ 9 ] ) ||
        ( Screen_Map[ y ] == Elements[ 10 ] ) ||( Screen_Map[ y ] == Elements[ 11 ] ) )
        {
            //std::cout << "44441" << std::endl ;
            What[ y ] = 4;
            //File.write( (char*) &What , sizeof(int) ) ;
        }
        //}
    }
   
    /////////////////////////////////////////////////////
    File.write( reinterpret_cast < const char *>( & What ), sizeof( What ) );
    //std::cout << "55555" << std::endl ;
    ///WSTAWIAMY KOD
    File.write(( const char * ) & Code_Nick, sizeof( Code_Nick ) );
   
    //std::cout << "66666" << std::endl ;
    for( int i = 0; i < 10; i++ )
         File.write( reinterpret_cast < char *>( & Top10_Nick[ i ] ), sizeof( Max ) ); //Max to int = 15
   
    //(const char*)
   
    //std::cout << "77777" << std::endl ;
    ///KOLEJNY KOD
    File.write( Code_Point.c_str(), sizeof( Code_Point ) );
   
    for( int i = 0; i < 10; i++ )
         File.write( reinterpret_cast < char *>( & Top10_Points[ i ] ),( sizeof( Top10_Points.size() ) * sizeof( unsigned ) ) ); ///TUTAJ JEST ZAPIS WYNIKOW Z KTORYM MAM PROBLEMY
    //std::cout << "88888" << std::endl ;
   
   
    File.write( Check_File.c_str(), sizeof( Check_File ) );
   
    //std::cout << "99999" << std::endl ;
    File.close();
   
    return true;
}

Check_File - String ktory mowi ze to moj plik
Code_Point - String ktory mowi ze za nim sa wyniki graczy
Code_Nick  - String ktory mowi ze za nim sa nazwy graczy

Ponizej zalaczam zdjecie na ktorym widac w konsolce jaki wynik przypisuje do zmiennych. Te dane zawsze sa zapisywane do pliku przy tworzeniu mapy i po odczycie top10 powinny tam sie znajdowac.
Obok jest wynik jaki program pokazuje na ekranie. Nazwy graczy dzialaja tak jak trzeba.
http://www.fotosik.pl​/pokaz_obrazek​/f0d25ca8ce23a25f.html

Dodam tez odczyt mapy bo moze tutaj gdzies robie blad
C/C++
bool Map::Load_Map( ALLEGRO_DISPLAY * display, std::string Name )
{
    File_Name = "Maps\\" + Name;
    //OTWIERAMY PLIK DO ODCZYTU BINARNEGO
    std::fstream File;
    File.open( File_Name.c_str(), std::ios::in | std::ios::binary );
   
    if( !File )
    {
        al_show_native_message_box( display, "MAP ERROR", "ERROR", "You can not open the map, possible that the map does not exist", NULL, ALLEGRO_MESSAGEBOX_ERROR );
        return false;
    }
   
    //CO MAMY WGRAC DO MAPY
    int What[ 400 ];
   
    File.read(( char * ) & What, sizeof( What ) );
   
    for( int y = 0; y < 400; y++ )
    {
        //PUSTE MIEJSCE
        if( What[ y ] == 1 )
             Screen_Map[ y ] = Elements[ 15 ];
        //SCIANA
        else if( What[ y ] == 2 )
             Screen_Map[ y ] = Elements[ 16 ];
        //GLOWA WEZA  -[]
        else if( What[ y ] == 3 )
        {
            std::cout << "Y W ODCZYCIE MAPY = " << y << std::endl;
           
            //POBIERAMY POZYCJE WEZA
            Snakess->Snake[ 0 ][ 0 ] = x;
            Snakess->Snake[ 0 ][ 1 ] = y;
           
            Screen_Map[ y ] = Elements[ 0 ];
        }
        //OGON WEZA []-
        else if( What[ y ] == 4 )
        {
           
            //POBIERAMY POZYCJE WEZA
            Snakess->Snake[ 1 ][ 0 ] = x;
            Snakess->Snake[ 1 ][ 1 ] = y;
           
            Screen_Map[ y ] = Elements[ 8 ];
        }
    }
   
    ///POBIERAMY MIEJSCE NICKOW W PLIKU
    int place = Return_Place_of_String( File, Code_Nick );
   
    if( place == - 1 )
    {
        al_show_native_message_box( display, "ERROR", "ERROR FILE", "FILE DONT HAVE TOP10 NICK", NULL, ALLEGRO_MESSAGEBOX_ERROR );
        return false;
    }
    ///USTAWIAMY WSKAZNIK DO CZYTANIA (seekp WSKAZNIK PISANIA)
    File.seekg( place );
    for( int i = 0; i < 10; i++ )
    {
        //char a[15] ; (char *)
        File.read( reinterpret_cast < char *>( & Top10_Nick[ i ] ), sizeof( Max ) );
        //= a ;
    }
   
    ///POBIERAMY MIEJSCE PUNKTY W PLIKU
    place = Return_Place_of_String( File, Code_Point );
   
    if( place == - 1 )
    {
        al_show_native_message_box( display, "ERROR", "ERROR FILE", "FILE DONT HAVE TOP10 POINTS", NULL, ALLEGRO_MESSAGEBOX_ERROR );
        return false;
    }
   
    File.seekg( place );
    for( int i = 0; i < 10; i++ )
         File.read( reinterpret_cast < char *>( & Top10_Points[ i ] ),( sizeof( Top10_Points.size() ) * sizeof( unsigned ) ) );
   
    File.close();
}

/// Funkcja Return_Place_of_String( File , Code_Point )
int Return_Place_of_String( std::fstream & File, std::string Searches )
{
   
    std::string a(( std::istreambuf_iterator < char >( File ) ), std::istreambuf_iterator < char >() );
   
    //std::istreambuf_iterator<int>()
    //SZUKAMY W PLIKU STRINGA
    int i = a.find( Searches );
    //std::search( File.beg , File.end , Searches.begin() , Searches.end() ) ;
   
    if( i == - 1 )
         return - 1;
    else
         return i + Searches.length();
    //tutaj rowniez kombinowalem i zwracalem samo "i" ale przy takim zapisie Nick gracza wypisuje sie tak jak trzeba
}
P-114809
pekfos
» 2014-07-31 22:54:51
Code_Nick jest typu std::string? Nie możesz tak go zapisać.
P-114810
« 1 » 2 3 4 5
  Strona 1 z 5 Następna strona