#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <time.h>
#include <string.h>
#define GAME_SCORES "scores.bin"
#define PLAYERS_COUNT 10
#define NAME_LENGTH 24
struct Player {
char name[NAME_LENGTH];
unsigned counter;
};
FILE * try_open_file(char * mode) {
FILE * file = fopen(GAME_SCORES, mode);
return file;
}
int read_score_table(FILE * file, struct Player * score_table, size_t count) {
size_t cnt = fread(score_table, sizeof(struct Player), count, file);
return cnt;
}
void write_file(FILE * file, const struct Player * score_table, size_t count) {
fwrite(score_table, count, sizeof(struct Player), file);
}
void show_players(const struct Player * score_table, size_t count) {
for (int i = 0; i < count; ++i) {
printf( "----------------------\n"
"Player: %s\n"
"Score : %d\n",
(char *)&(score_table[i].name),
score_table[i].counter
);
}
}
void fill_example_players(struct Player * score_table, size_t count) {
for (int i = 0; i < count; ++i) {
memset(score_table[i].name, '\0', NAME_LENGTH - 1);
char name[NAME_LENGTH] = {0};
sprintf(name, "Player%d", i);
strncpy((char *)&(score_table[i].name), name, NAME_LENGTH - 1);
score_table[i].name[NAME_LENGTH - 1] = '\0';
score_table[i].counter = rand() % 10;
}
}
int compare_player_score(const void * p1, const void * p2) {
const struct Player * player1 = p1;
const struct Player * player2 = p2;
int answer = 0;
if (player1->counter == player2->counter) {
answer = 0;
} else if (player1->counter < player2->counter) {
answer = 1;
} else {
answer = -1;
}
return answer;
}
void sort_players(struct Player * score_table, size_t count) {
qsort(score_table, count, sizeof(struct Player), compare_player_score);
}
int main(void) {
srand(time(0));
struct Player score_table[PLAYERS_COUNT] = {0};
fill_example_players(score_table, PLAYERS_COUNT);
printf("***Before sort...***\n");
show_players(score_table, PLAYERS_COUNT);
sort_players(score_table, PLAYERS_COUNT);
printf("***After sort...***\n");
show_players(score_table, PLAYERS_COUNT);
printf("***Write to file..***\n");
FILE * file = try_open_file("w");
if (file == NULL) {
fprintf(stderr, "Error open %s file.\n", GAME_SCORES);
exit(EXIT_FAILURE);
}
write_file(file, score_table, PLAYERS_COUNT);
fclose(file);
printf("***Read from file...***\n");
struct Player other_score_table[PLAYERS_COUNT] = {0};
file = try_open_file("r");
if (file == NULL) {
fprintf(stderr, "Error open %s file.\n", GAME_SCORES);
exit(EXIT_FAILURE);
}
read_score_table(file, other_score_table, PLAYERS_COUNT);
show_players(other_score_table, PLAYERS_COUNT);
return 0;
}