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

[C] odczytanie danych z pliku binarnego - najlepsze wyniki w grze

Ostatnio zmodyfikowano 2016-05-06 10:55
Autor Wiadomość
maxotka14514
Temat założony przez niniejszego użytkownika
[C] odczytanie danych z pliku binarnego - najlepsze wyniki w grze
» 2016-05-04 12:14:37
Witam, mam mały problem - tworzę znaną wszystkim grę Snake i pracuję nad listą najlepszych wyników w grze, którą potem do niej przypnę. Punkty są zapisywane do pliku binarnego, nicki graczy do pliku tekstowego. Stworzyłam kilka plików, w każdym jest przykładowe imię, wszyscy mają domyślnie 0 punktów. Program pobiera nick i wpisuje przykładową liczbę punktów (chodzi o sprawdzenie poprawności) do tablicy struktur, która następnie jest sortowana (niższe wyniki spadają w dół) i elementy tej tablicy są zapisywane do odpowiednich plików. Potem odczytuję zawartość plików aby sprawdzić poprawność i działa... do czasu zakończenia pracy programu :( Nicki graczy są zapisywane ale po ponownym uruchomieniu programu okazuje się, że wszyscy dalej mają 0 punktów :( zapisana liczba znika... Bardzo zależy mi na tym, aby zapisane wyniki wyświetlały się prawidłowo przy każdym ponownym uruchomieniu programu. Czy któryś z Miłych Panów mógłby wspomóc damę w opałach? :) Tutaj jest kodzik:
C/C++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define N 15
#define LENGTH 13
#define ELEMENTS 10
#define FILES 20

struct players {
    char nick[ N ];
    int points;
};

struct players gamers[ ELEMENTS ];
char nick[ N ];
int points;

char files[][ LENGTH ] = {
    "nick1.txt",
    "points1.bin",
    "nick2.txt",
    "points2.bin",
    "nick3.txt",
    "points3.bin",
    "nick4.txt",
    "points4.bin",
    "nick5.txt",
    "points5.bin",
    "nick6.txt",
    "points6.bin",
    "nick7.txt",
    "points7.bin",
    "nick8.txt",
    "points8.bin",
    "nick9.txt",
    "points9.bin",
    "nick10.txt",
    "points10.bin"
};

//odczytuje dane z plików
void list_of_results( void ) {
    int i = 0, j = 0;
    puts( "List of results: " );
    for( i = 0, j = 0; i + 1 < FILES, j < ELEMENTS; i = i + 2, j++ ) {
        FILE * file1 = fopen( files[ i ], "r" );
        FILE * file2 = fopen( files[ i + 1 ], "b" );
        fscanf( file1, "%s", gamers[ j ].nick );
        fscanf( file2, "%d", gamers[ j ].nick );
        fread( gamers[ j ].points, sizeof( gamers[ j ] ), 1, file2 );
        printf( "\n%s\t%d\n", gamers[ j ].nick, gamers[ j ].points );
        fclose( file1 );
        fclose( file2 );
    }
}

//zapisuje elementy struktury do plików
void save_the_list( void ) {
    int i = 0, j = 0;
    for( i = 0, j = 0; i + 1 < FILES, j < ELEMENTS; i = i + 2, j++ ) {
        FILE * file1 = fopen( files[ i ], "w" );
        FILE * file2 = fopen( files[ i + 1 ], "b" );
        fprintf( file1, "%s", gamers[ j ].nick );
        fwrite( gamers[ j ].points, sizeof( gamers[ j ] ), 1, file2 );
        fclose( file1 );
        fclose( file2 );
    }
}

//dodaje odczytane dane do struktury, wyniki od razu spadaja w dol
void add_to_list() {
    int i = 0;
    for( i = 0; i < ELEMENTS; i++ ) {
        if( points > gamers[ i ].points ) {
            int j = ELEMENTS - 1;
            for( j = ELEMENTS - 1; j > i; j-- ) {
                strcpy( gamers[ j ].nick, gamers[ j - 1 ].nick );
                gamers[ j ].points = gamers[ j - 1 ].points;
            }
            strcpy( gamers[ i ].nick, nick );
            gamers[ i ].points = points;
            break;
        }
    }
    printf( "\n\nDEBUG:" ); //sprawdza poprawnosc posortowania listy
    int k = 0;
    for( k = 0; k < ELEMENTS; k++ )
         printf( "\n%s\t%d\n", gamers[ k ].nick, gamers[ k ].points );
   
    save_the_list();
}

//pobiera nick od użytkownika
void save_the_result( void ) {
    srand( time( 0 ) );
    points = 100 + rand() % 900; //dla testu: losuje liczbe bedaca przykladowa liczba punktow
    printf( "DEBUG: %d\nPodaj nick:\n", points );
    scanf( "%s", nick );
    add_to_list();
}

int main( void ) {
    list_of_results();
    save_the_result();
    list_of_results(); //sprawdza zapis
    return 0;
}
P-147920
Gibas11
» 2016-05-04 13:31:29
Wstaw kod w znaczniki
[cpp] /* kod */ [/cpp]
 bo poucinało indeksy
[ i ]
.
Dlaczego trzymasz to w osobnych plikach?

któryś z Miłych Panów
Jest jeszcze „Ekspert C++” Monika, więc nie generalizuj. ;)
P-147925
darko202
» 2016-05-04 14:25:12
nie chce mi się "debugować" kodu
dlatego zmieniam już kolejny raz zdanie na temat tego błedu

popatrz na linie

C/C++
fread( gamers[ j ].points, sizeof( gamers[ j ] ), 1, file2 );
printf( "\n%s\t%d\n", gamers[ j ].nick, gamers[ j ].points ); //tu poprzednia linia nie pokazuje wyniku fread


przeczytaj
http://cpp0x.pl/dokumentacja​/standard-C/fread/456
i sprawdź wynik działania fread przed printf
P-147928
maxotka14514
Temat założony przez niniejszego użytkownika
» 2016-05-06 10:55:47
Ok, dzięki Wam bardzo ;) znalazłam sposób bez konieczności użycia funkcji fread() i nie trzeba było korzystać z plików binarnych i działa jak należy ;) pozdrawiam ^^
P-147977
« 1 »
  Strona 1 z 1