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

[Fstream&Allegro] Zapisywanie do pliku i wczytywanie z niego

Ostatnio zmodyfikowano 2014-01-29 14:22
Autor Wiadomość
Loodwin
Temat założony przez niniejszego użytkownika
[Fstream&Allegro] Zapisywanie do pliku i wczytywanie z niego
» 2014-01-21 21:05:58
Witam!
Mam oto taki kodzik:
C/C++
void save_ship( string save ) //to klasa, która zapisuje całą trójwymiarową tablicę samymi zerami
{
    fstream plik;
    string path = "saves/" + save + ".txt";
    string ex;
    char znak = 44;
    plik.open( path.c_str(), ios::out | ios::trunc );
    for( int iz = 0; iz <= 25; iz++ )
    {
        for( int iy = 0; iy <= 100; iy++ )
        {
            for( int ix = 0; ix <= 100; ix++ )
            {
                ex = "0" + znak;
                plik.write( & ex[ 0 ], ex.length() );
            }
        }
    }
    plik.close();
}

void show_ship() //to funkcja, która wyświetla całą bitmapę na podstawie tej tablicy
{
    if( mx >= 1000 && x_move < 1000 ) x_move += 20;
   
    if( mx <= 0 && x_move > 0 ) x_move -= 20;
   
    if( my >= 600 && y_move < 600 ) y_move += 20;
   
    if( my <= 0 && y_move > 0 ) y_move -= 20;
   
    for( int iz = 0; iz <= 25; iz++ )
    {
        for( int iy = 0; iy <= 100; iy++ )
        {
            for( int ix = 0; ix <= 100; ix++ )
            {
                masked_blit( texture, shipbmp, ship[ iz ][ iy ][ ix ] * 20, 0, ix * 20, iy * 20, 20, 20 );
            }
        }
    }
    masked_blit( shipbmp, bufor, x_move, y_move, 0, 0, 1000, 600 );
};
I są dwa problemy:
1. W pliku tekstowym jest prawie wszystko okej, ale tylko prawie ponieważ, w którychś miejscach pojawiają się tytułowe "shity", czyli jakieś zlepki liter, cyfr i znaków.
2. Podczas wyświetlania w trzech losowych całkowicie miejscach, lecz w tych samych pojawia się kafelek różny od innych. Myślę, że drugi problem wynika z pierwszego, lecz nie wiem o co chodzi. Możliwe, że to problem z rodzaju "komputer coś wymyślił i się uwziął".

Jeżeli ktoś byłby pomocny i mógłby mi pomóc to z góry dziękuje.
P-102751
Loodwin
Temat założony przez niniejszego użytkownika
Od jednego problemu do drugiego...
» 2014-01-23 11:56:34
Witam!
Rozwiązałem już powyższy problem i wszystko ładnie się zapisuje i wyświetla, lecz teraz jest inny problem. Otóż po wyłączeniu programu pojawia się taki komunikat "This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information", a później "Program przestał działać". Teraz cały kod wygląda tak:
C/C++
#include <allegro.h>
#include <fstream>
#include <string>

using namespace std;


int frame = 0;

volatile long speed = 0;
void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );

int mx = 0, my = 0, mb = 0, mz = 0;
void myszka()
{
    if( mx != mouse_x || my != mouse_y || mb != mouse_b || mz != mouse_z )
    {
        mx = mouse_x;
        my = mouse_y;
        mb = mouse_b;
        mz = mouse_z;
    }
};

BITMAP * bufor;
BITMAP * shipbmp;
BITMAP * texture;

char ship[ 25 ][ 30 ][ 50 ];
char akt_z = 25;
short x_move, y_move = 0;

void load_ship( string save )
{
    fstream plik;
    string path = "saves/" + save + ".txt";
    string ex;
    char znak = 44;
    plik.open( path.c_str(), ios::in );
    for( int iz = 0; iz >= 25; iz++ )
    {
        for( int iy = 0; iy >= 30; iy++ )
        {
            for( int ix = 0; ix >= 50; ix++ )
            {
                getline( plik, ex, znak );
                ship[ iz ][ iy ][ ix ] = atoi( ex.c_str() );
            }
        }
    }
    plik.close();
}
void show_ship()
{
    for( int iz = 0; iz <= 25; iz++ )
    {
        for( int iy = 0; iy <= 30; iy++ )
        {
            for( int ix = 0; ix <= 50; ix++ )
            {
                ship[ iz ][ iy ][ ix ] = 0;
                masked_blit( texture, shipbmp, ship[ iz ][ iy ][ ix ] * 20, 0, ix * 20, iy * 20, 20, 20 );
            }
        }
    }
    masked_blit( shipbmp, bufor, x_move, y_move, 0, 0, 1000, 600 );
};
void save_ship( string save )
{
    fstream plik;
    string path = "saves/" + save + ".txt";
    string ex;
    char znak = 44;
    plik.open( path.c_str(), ios::out | ios::trunc );
    for( int iz = 0; iz <= 25; iz++ )
    {
        for( int iy = 0; iy <= 30; iy++ )
        {
            for( int ix = 0; ix <= 50; ix++ )
            {
                ex = ship[ iz ][ iy ][ ix ] + znak;
                plik.write( & ex[ 0 ], ex.length() );
            }
        }
    }
    plik.close();
}


int main()
{
    allegro_init();
    install_keyboard();
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 10 ) );
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 1000, 600, 0, 0 );
   
    install_mouse();
    show_mouse( screen );
    unscare_mouse();
   
    bufor = create_bitmap( 1000, 600 );
    shipbmp = create_bitmap( 1000, 600 );
    texture = load_bitmap( "graphic/ship_texture.bmp", default_palette );
   
    load_ship( "taki" );
    while( !key[ KEY_ESC ] )
    {
        clear_to_color( bufor, makecol( 100, 100, 100 ) );
        myszka();
       
        while( speed > 0 )
        {
            speed--;
            frame++;
            if( frame >= 10 ) frame = 0;
           
        }
        show_ship();
        blit( bufor, screen, 0, 0, 0, 0, 1000, 600 );
        clear_keybuf();
    }
    save_ship( "taki" );
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
Jeśli miał ktoś podobny lub taki sam problem oraz chciałby mi coś doradzić to z góry dziękuję.
P-102928
Loodwin
Temat założony przez niniejszego użytkownika
Problemy...
» 2014-01-28 11:21:47
Witam po raz kolejny!
Poprzedni problem rozwiązałem tak naprawdę nie wiem jak. Zmodyfikowałem trochę kod na potrzeby samej zmiany projektu i już wszystko było dobrze. Teraz jest inny problem. Po pierwszym włączeniem programu wszystko jest czarne, jak powinno. Wtedy modyfikuję jakoś tą bitmapę i zapisuję. Wyłączam program, sprawdzam sam plik tekstowy i tam wszystko jest prawidłowo. Lecz, gdy włączę znowu program to bitmapa nadal jest czarna, choć nie powinna. Jest zapewne to błąd w funkcji ładującej.
Kod wygląda teraz tak:
C/C++
#include <allegro.h>
#include <fstream>
#include <string>
#include <cmath>

using namespace std;


int frame = 0;

volatile long speed = 0;
void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );

short mx = 0, my = 0, mb = 0, mz = 0;
void myszka()
{
    if( mx != mouse_x || my != mouse_y || mb != mouse_b || mz != mouse_z )
    {
        mx = mouse_x;
        my = mouse_y;
        mb = mouse_b;
        mz = mouse_z;
    }
};

BITMAP * bufor;
BITMAP * shipbmp;
BITMAP * texture;

char ship[ 30 ][ 50 ];
short x_move, y_move = 0;
char akt_rodz;

void load_ship( string save )
{
    fstream plik;
    string path = "saves/" + save + ".txt";
    string ex;
    char znak = 44;
    plik.open( path.c_str(), ios::in );
    if( plik.eof() == 1 ) allegro_message( "lol0" );
   
    for( int iy = 0; iy < 30; iy++ )
    {
        for( int ix = 0; ix < 50; ix++ )
        {
            getline( plik, ex, znak );
            ship[ iy ][ ix ] = atoi( ex.c_str() );
        }
    }
    if( plik.eof() == 1 ) allegro_message( "lol1" );
   
    plik.close();
}
void show_ship()
{
    for( int iy = 0; iy <= 30; iy++ )
    {
        for( int ix = 0; ix <= 50; ix++ )
        {
            masked_blit( texture, shipbmp, ship[ iy ][ ix ] * 20, 0, ix * 20, iy * 20, 20, 20 );
        }
    }
    masked_blit( shipbmp, bufor, x_move, y_move, 0, 0, 1000, 600 );
};
void save_ship( string save )
{
    fstream plik;
    string path = "saves/" + save + ".txt";
    string ex;
    char znak = 44;
    plik.open( path.c_str(), ios::out | ios::trunc );
    for( int iy = 0; iy <= 30; iy++ )
    {
        for( int ix = 0; ix <= 50; ix++ )
        {
            ex = ship[ iy ][ ix ] + znak;
            plik.write( & ex[ 0 ], ex.length() );
        }
    }
    plik.close();
}
void mousing()
{
    akt_rodz = mz;
    masked_blit( texture, bufor, akt_rodz * 20, 0, floor( mx / 20 ) * 20, floor( my / 20 ) * 20, 20, 20 );
    short akt_y = floor( my / 20 );
    short akt_x = floor( mx / 20 );
    if( mb == 1 ) ship[ akt_y ][ akt_x ] = akt_rodz;
   
    if( mb == 2 ) ship[ akt_y ][ akt_x ] = 0;
   
}

int main()
{
    allegro_init();
    install_keyboard();
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 10 ) );
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 1000, 600, 0, 0 );
   
    install_mouse();
    show_mouse( screen );
    unscare_mouse();
   
    bufor = create_bitmap( 1000, 600 );
    shipbmp = create_bitmap( 1000, 600 );
    texture = load_bitmap( "graphic/ship_texture.bmp", default_palette );
   
    load_ship( "taki" );
    while( !key[ KEY_ESC ] )
    {
        myszka();
       
        show_ship();
        mousing();
       
        if( key[ KEY_F5 ] )
        {
            save_ship( "taki" );
            textprintf_ex( bufor, font, 20, 20, makecol( 50, 50, 50 ), - 1, "zapisało się" );
        }
        blit( bufor, screen, 0, 0, 0, 0, 1000, 600 );
        clear_keybuf();
    }
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
Nikt nie pomógł mi w poprzednich problemach, ale nie uważam tego za złe. Po prostu nikt nie miał czegoś podobnego. :D

Z góry dziękuję za pomoc.
P-103394
Loodwin
Temat założony przez niniejszego użytkownika
» 2014-01-29 14:22:46
refresh
P-103507
« 1 »
  Strona 1 z 1