使用fwrite的奇怪行为

时间:2017-11-18 13:33:23

标签: c memory save buffer fwrite

我正在尝试将结构保存到文件中。它工作正常,我可以毫无问题地加载它。但是当我用十六进制编辑器检查我的保存文件时,我可以看到存储在文件中的先前printf的某些部分。我真的不明白这是怎么可能的,特别是当我的程序完全正常加载结构时。

我有三个结构(Orientation,ShipType,Status和PlayerType是枚举,你可以用Int替换它们):

struct Map
{
    int width, height;
    int* cases;
};
typedef struct Map Map;

struct Ship
{
    int x, y, length, firstShoot, color;
    int hasBeenDiscovered;
    Orientation orientation;
    ShipType type;
    Status status;
};
typedef struct Ship Ship;

struct Player
{
    int activeShips;
    Map map[2];
    char lastMoves[5][128];
    Ship ships[10];
    PlayerType type;
    int shipcolor[4];
    int color;
};
typedef struct Player Player;

这是我的程序树:

main() - > playMenu() - > actionMenu() - >保存()

以下是我的某个菜单(playMenu())的屏幕 https://imgur.com/iSvj6jk

我正在谈论的printf部分就是这样:

    printf("=========== BATAILLE NAVALE ===========\n"); // You can see part of "=======" in my save file
    printf("        ~~~~Jouer une partie~~~~\n\n");
    printf("1. Joueur contre joueur\n");
    printf("2. Joueur contre ordinateur\n");
    printf("3. Charger une partie\n\n"); // You can see "partie"
    printf("0. Quitter\n"); // You can see "0. Quitter"

    printf("\nVotre choix : "); // You can see "Votre choix"
    scanf("%d", &choix);

这是通过十六进制编辑器看到的文件块的屏幕

https://imgur.com/OntYGDH

您可以清楚地看到我的某些菜单是在该文件中编写的。这怎么可能 ? 不幸的是,我不能发布任何更多的代码,因为我必须发布这么多,但你知道是什么原因导致这个以及我需要在哪里解决这个问题吗?

以下是我的save()函数的代码,您可以看到它与这些菜单无关:

int save(Player players[2], int currentPlayer)
{
    int* i;
    FILE* file = NULL;

    file = fopen("save.txt","w+");

    if (file != NULL)
    {
        fwrite(players, sizeof(Player), 2, file);

        fwrite(players[0].map[0].cases, sizeof(int), players[0].map[0].width * players[0].map[0].height, file);
        fwrite(players[0].map[1].cases, sizeof(int), players[0].map[1].width * players[0].map[1].height, file);
        fwrite(players[1].map[0].cases, sizeof(int), players[1].map[0].width * players[1].map[0].height, file);
        fwrite(players[1].map[1].cases, sizeof(int), players[1].map[1].width * players[1].map[1].height, file);

        fwrite(&currentPlayer, sizeof(int), 1, file);
    }
    else
    {
        // error
    }

    fclose(file);

    return 1;
}

0 个答案:

没有答案