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. 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. |
|
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. |
|
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. ( 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.. |
|
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...
|
|
1aam2am1 |
» 2014-07-30 19:56:26 Wygląda na standardową? #include <fstream> #include <stdio.h>
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. |
|
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. |
|
Haker123 Temat założony przez niniejszego użytkownika |
» 2014-07-31 22:49:19 Kod zapisu danych do pliku wyglada tak bool Map::Save_Map( ALLEGRO_DISPLAY * display ) { std::ofstream File( File_Name.c_str(), std::ios::out | std::ios::binary ); if( !File ) { al_show_native_message_box( display, "MAP ERROR", "ERROR", "You can not save the map", NULL, ALLEGRO_MESSAGEBOX_ERROR ); return false; } int What[ 400 ]; for( int y = 0; y < 400; y++ ) { if( Screen_Map[ y ] == Elements[ 15 ] ) { What[ y ] = 1; } else if( Screen_Map[ y ] == Elements[ 16 ] ) { What[ y ] = 2; } else if(( Screen_Map[ y ] == Elements[ 0 ] ) ||( Screen_Map[ y ] == Elements[ 1 ] ) || ( Screen_Map[ y ] == Elements[ 2 ] ) ||( Screen_Map[ y ] == Elements[ 3 ] ) ) { What[ y ] = 3; } else if(( Screen_Map[ y ] == Elements[ 8 ] ) ||( Screen_Map[ y ] == Elements[ 9 ] ) || ( Screen_Map[ y ] == Elements[ 10 ] ) ||( Screen_Map[ y ] == Elements[ 11 ] ) ) { What[ y ] = 4; } } File.write( reinterpret_cast < const char *>( & What ), sizeof( What ) ); File.write(( const char * ) & Code_Nick, sizeof( Code_Nick ) ); for( int i = 0; i < 10; i++ ) File.write( reinterpret_cast < char *>( & Top10_Nick[ i ] ), sizeof( Max ) ); 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 ) ) ); File.write( Check_File.c_str(), sizeof( Check_File ) ); 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 bool Map::Load_Map( ALLEGRO_DISPLAY * display, std::string Name ) { File_Name = "Maps\\" + Name; 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; } int What[ 400 ]; File.read(( char * ) & What, sizeof( What ) ); for( int y = 0; y < 400; y++ ) { if( What[ y ] == 1 ) Screen_Map[ y ] = Elements[ 15 ]; else if( What[ y ] == 2 ) Screen_Map[ y ] = Elements[ 16 ]; else if( What[ y ] == 3 ) { std::cout << "Y W ODCZYCIE MAPY = " << y << std::endl; Snakess->Snake[ 0 ][ 0 ] = x; Snakess->Snake[ 0 ][ 1 ] = y; Screen_Map[ y ] = Elements[ 0 ]; } else if( What[ y ] == 4 ) { Snakess->Snake[ 1 ][ 0 ] = x; Snakess->Snake[ 1 ][ 1 ] = y; Screen_Map[ y ] = Elements[ 8 ]; } } 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; } File.seekg( place ); for( int i = 0; i < 10; i++ ) { File.read( reinterpret_cast < char *>( & Top10_Nick[ i ] ), sizeof( Max ) ); } 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(); }
int Return_Place_of_String( std::fstream & File, std::string Searches ) { std::string a(( std::istreambuf_iterator < char >( File ) ), std::istreambuf_iterator < char >() ); int i = a.find( Searches ); if( i == - 1 ) return - 1; else return i + Searches.length(); }
|
|
pekfos |
» 2014-07-31 22:54:51 Code_Nick jest typu std::string? Nie możesz tak go zapisać. |
|
« 1 » 2 3 4 5 |