Я должен сделать игру в университете в C.
У меня есть реальные проблемы с чтением и записью в двоичных файлах.
Я уже спрашивал мониторы, прочитал главу обинарные файлы в книге, и я попытался найти в Google что-нибудь, что могло бы помочь мне лучше понять мою проблему, но ни один из них не работал должным образом.
В игре есть структура со всемиИнформация, которую мы должны сохранить игроку, перезапускает игру, когда ему нравится.Мы должны сохранить все разные игры в одном двоичном файле, используя имя для выражения.Итак, я сделал алгоритм, который читает двоичный файл, если он существует, и если он находит игру с тем же именем игрока, он перезаписывает ее новой игрой, если он не существует, он напишет в концефайла.
Мы также должны выполнить чтение файла для загрузки предыдущей игры.
Я сделал небольшую программу, чтобы проверить идею со структурой, имеющей только имя игрока,но у меня проблема: когда я сохраняю, кажется, что он работает неправильно, но когда я пытаюсь загрузить его, он показывает мне дважды или даже три раза имя игрока (я положил команду put с именем вслучай, когда программа находит игру, сохраненную с тем же именем).
Другая вещь, которая меня удивляет, это то, что когда я сохраняю две разные игры с разными именами, когда я пытаюсь загрузить первую, она показывает толькоодин раз.
Я бы очень признателен за любую помощь, которую вы могли бы дать мне, почему это происходит.
Мой код:
int main()
{
GAME game;
GAME jogoTeste;
FILE *saved_game;
int i = 0;
int choice, saved = 0;
gets(game.player.name);
printf("Choose what you want to do:\n");
printf("1 to save, 2 to load\n");
scanf("%d", &choice);
if (choice == 1)
{
i = 0;
saved_game = fopen("saved_game.dat", "a+b");
rewind(saved_game);
while (!feof(saved_game))
{
fread(&testeGame, sizeof(GAME), 1, saved_game);
if (!strcmp(testGame.player.name, game.player.name))
{
int control = fwrite(&game, sizeof(GAME), 1, saved_game);
if (control != 1)
{
printf("An error happened in the wrintting\n");
printf("Were written %d elements intead of 1.\n", control);
}
else
{
saved = 1;
printf("Player updaded!\n");
}
}
}
if (saved == 0);
{
fwrite(&game, sizeof(GAME), 1, saved_game);
printf("New player saved\n");
}
fclose(saved_game);
}
else if (escolha == 2)
{
i = 0;
saved_game = fopen("saved_game.dat", "rb");
while (!feof(saved_game))
{
fread(&testGame, sizeof(GAME), 1, saved_game);
if (strcmp(testGame.player.name, game.player.name) == 0)
{
puts(testGame.player.name);
}
}
fclose(saved_game);
}
}
и структура GAME (другоенекоторые из них здесь не так важны):
typedef struct
{
PLAYER player;
GUARD guards[5];
KEY keys[5];
COORDINATE walls[50];
COORDINATE tower[50];
COORDINATE ogre;
} GAME;
Если на португальском языке что-то есть, потому что я его сейчас не видел и просто забыл перевести это здесь.Извините
РЕДАКТИРОВАТЬ: Я пытался некоторые изменения, которые вы упомянули, и ошибка, которая дублировала мою загрузочную игру, ушла, но есть кое-что, что действительно озадачивает мою голову прямо сейчас, мой код, который сохраняет игру правильносейчас:
saved = 0;
saved_game = fopen("saved_game.dat", "r+b");
while (fread(&jogoTeste, sizeof(GAME), 1, saved_game))
{
if (strcmp(jogoTeste.player.name, game.player.name) == 0)
{
fseek(saved_game, currentOffSet, SEEK_SET);
control = fwrite(&game, sizeof(GAME), 1, saved_game);
if (control != 1)
{
printf("An error happened in the wrintting\n");
printf("Were written %d elements intead of 1.\n", control);
}
else
{
saved = 1;
printf("Player updated!\n");
}
fseek(saved_game, 0, SEEK_END);
}
currentOffSet = ftell(saved_game);
}
if (!saved);
{
fwrite(&game, sizeof(GAME), 1, saved_game);
printf("New player saved\n");
}
fclose(saved_game);
Но когда я его выполняю, на экране появляется сообщение: «Игрок обновлен!»И "Новый игрок сохранен", как это может быть?Когда он обновляет проигрыватель, он также изменяет сохраненную переменную на 1, и для этого есть перед оператором «Новый игрок сохранен».Как это может быть выполнение двух частей, которые не должны быть?