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
» 2014-08-02 15:35:10
Po zmianie na
C/C++
File.read( reinterpret_cast < char *>( & Top10_Nick[ i ] ), Max );
Nic nie wyswietla mi ;/ tak jakby string byl pusty, a punkty dalej wypisuja smieci.

Edit:

Jak dopisac to zero na koncu stringa??
P-114944
pekfos
» 2014-08-02 15:39:14
Nic nie wyswietla mi ;/
Podaj aktualny, kompletny kod.

Jak dopisac to zero na koncu stringa??
Zwiększ rozmiar o 1. size() nie uwzględnia zera na końcu.
P-114945
Haker123
Temat założony przez niniejszego użytkownika
» 2014-08-02 16:33:01
Czyli przy zapisie stringa musze dac Nick.size() + 1 ??

Oto kod.
Odczyt
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 ] = y % 20;
            Snakess->Snake[ 0 ][ 1 ] = y / 20;
           
            Screen_Map[ y ] = Elements[ 0 ];
        }
        //OGON WEZA []-
        else if( What[ y ] == 4 )
        {
           
            //POBIERAMY POZYCJE WEZA
            Snakess->Snake[ 1 ][ 0 ] = y % 20;
            Snakess->Snake[ 1 ][ 1 ] = y / 20;
           
            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 ] ), 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( unsigned ) );
   
    File.close();
}

Zapis
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( Code_Nick.c_str(), Code_Nick.size() );
   
    //std::cout << "66666" << std::endl ;
    for( int i = 0; i < 10; i++ )
         File.write( Top10_Nick[ i ].c_str(), Max );
   
    //(const char*)
   
    //std::cout << "77777" << std::endl ;
    ///KOLEJNY KOD
    File.write( Code_Point.c_str(), Code_Point.size() );
   
    for( int i = 0; i < 10; i++ )
         File.write( reinterpret_cast < char *>( & Top10_Points[ i ] ), sizeof( unsigned ) );
    //std::cout << "88888" << std::endl ;
   
    File.write( Check_File.c_str(), Check_File.size() );
   
    //std::cout << "99999" << std::endl ;
    File.close();
   
    return true;
}
Konstruktor klasy Map w ktorym nadaje poczatkowe wartosci i sa one zapisywane do pliku przy tworzeniu nowej mapy.
C/C++
Map( void )
{
    //REZERWACJA DLA MAPY
    //Screen_Map.reserve (400) ;
    //REZERWACJA MIEJSC DLA Elements
    //Elements.reserve(17) ;
    //REZERWACJA MIEJSC DLA TOP10
    //Top10_Nick.reserve(10) ;
    //Top10_Points.reserve(10) ;
   
    //MAKSYMALNA ILOSC ZNAKOW PRZY NICKU I NAZWIE PLIKU
    Max = 15;
   
    Snakess = new Snakes();
   
    //WCZYTUJEMY WEZA
    for( int i = 0; i < 14; i++ )
    {
        std::stringstream snake;
        snake << "Graphics\\Snake\\" << i + 1 << ".png";
        Elements.push_back( load_bitmap_at_size( snake.str().c_str(), 30, 30 ) );
    }
    //WCZYTUJEMY SPAWN
    Elements.push_back( load_bitmap_at_size( "Graphics\\Eat_Me\\1.png", 30, 30 ) );
    //WCZYTUJEMY EMPTY
    Elements.push_back( load_bitmap_at_size( "Graphics\\Empty.png", 30, 30 ) );
    //WCZYTUJEMY SCIANE
    Elements.push_back( load_bitmap_at_size( "Graphics\\Wall\\1.png", 30, 30 ) );
   
    //WYPELNIAMY KONTENERY POCZATKOWYMI DANYMI
    for( int i = 0; i < 400; i++ )
         Screen_Map.push_back( Elements[ 15 ] );
    //( Max , '*' )
    std::string Nick = "***************";
   
   
    for( int i = 0; i < 10; i++ )
    {
        Top10_Nick.push_back( Nick );
        Top10_Points.push_back( 0 );
    }
   
    for( int i = 0; i < 10; i++ )
    {
        std::cout << "Top10_Points[" << i << "] = " << Top10_Points[ i ] << std::endl;
    }
    //al_rest(5.0) ;
};

EDIT:

Zapomnialem pokazac jak wypisuje zmienne na ekranie
C/C++
for( TextY = 100, ForI = 0; ForI < 10; ForI++, TextY += 50 )
{
    //std::cout << "Maps->Top10_Points[" << ForI << "] " << Maps->Top10_Points[ForI] << std::endl ;
    //std::cout << "Maps->Top10_Nick[" << ForI << "] " << Maps->Top10_Nick[ForI] << std::endl ;
   
    Top10_Points << Maps->Top10_Points[ ForI ];
    Top10_Nr << ForI + 1;
   
    al_draw_text( Font_Big, al_map_rgb( 44, 100, 255 ), 80, TextY, ALLEGRO_ALIGN_LEFT, Top10_Nr.str().c_str() );
    al_draw_text( Font_Big, al_map_rgb( 44, 100, 255 ), 150, TextY, ALLEGRO_ALIGN_LEFT, Maps->Top10_Nick[ ForI ].c_str() );
    al_draw_text( Font_Big, al_map_rgb( 44, 100, 255 ), 550, TextY, ALLEGRO_ALIGN_LEFT, Top10_Points.str().c_str() );
   
   
    //CZYSZCZENIE STRINGSTREAM
    Top10_Points.str( std::string() );
    Top10_Points.clear();
   
    Top10_Nr.str( std::string() );
    Top10_Nr.clear();
}
P-114951
pekfos
» 2014-08-02 16:53:02
C/C++
File.read( reinterpret_cast < char *>( & Top10_Nick[ i ] ), Max );
Nie możesz tak zapisać/odczytać. Znowu.

C/C++
///POBIERAMY MIEJSCE NICKOW W PLIKU
int place = Return_Place_of_String( File, Code_Nick );
Po co to?
P-114955
Haker123
Temat założony przez niniejszego użytkownika
» 2014-08-02 19:13:34
To jak mam odczytywac i zapisywac nazwy graczy oraz ich punkty?
Juz nie mam pomyslu :(

C/C++
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();
   
}

Ta funkcja ma za zadanie zwrucic miejsce stringa w pliku. Obecnie to malo przydatne w tym programie ale w innych programach przyda mi sie (mozliwe ze w obecnym zrobie tak ze wszystkie bitmapy beda w jednym pliku albo cos podobnego)
P-114956
pekfos
» 2014-08-02 19:40:12
To jak mam odczytywac i zapisywac nazwy graczy oraz ich punkty?
Juz nie mam pomyslu :(
To zacznij uważnie czytać odpowiedzi. Tekst zapisuj albo w formie c-stringa, albo w formie bloku danych o stałym rozmiarze - zależy od decyzji projektowych. Dostałeś odpowiedzi na oba sposoby. Ale jaki sens ciągnąć temat, skoro dalej masz te same błędy w kodzie..?
P-114957
Haker123
Temat założony przez niniejszego użytkownika
» 2014-08-02 20:14:53
Dzieki tobie wiem co robie zle ale nie wiem jak mam to poprawnie zapisac.
Staram sie wykozystac to co piszesz oraz to co znajde na internecie i mi nie wychodzi.
Mozesz podac przyklad jak ma wygladac zapis string i vektora do pliku binarnego??
Nie musi byc to do mojego programu, po prostu potrzebuje zobaczyc jak to powinno wygladac bo ja juz nie wiem.
P-114958
pekfos
» 2014-08-02 20:34:48
C/C++
#include <fstream>
#include <string>

int main()
{
    std::ofstream ofs( "out.bin", std::ios::binary );
   
    std::string str = "Lorem ipsum";
    ofs.write( str.c_str(), str.size() + 1 );
   
    int i = 0xABC;
    ofs.write( reinterpret_cast < const char *>( & i ), sizeof( int ) );
}
Efekt zobacz sobie w hexedytorze.
P-114959
1 2 « 3 » 4 5
Poprzednia strona Strona 3 z 5 Następna strona