C-尝试将整数和结构数组存储到二进制文件中

问题描述 投票:0回答:1

我正在尝试制作一个游戏,其中每个玩家都有结构,并将这些玩家结构存储在一个数组中。现在我尝试向游戏添加保存/加载功能,保存玩家数量和每个玩家的结构,但由于某种原因我无法弄清楚如何正确存储数据。我正在使用一个二进制文件,并尝试将整个数组读取到变量中,以便游戏可以继续,但它要么根本不加载文件,要么游戏将玩家计数读取为 0 然后结束。有什么建议么?谢谢您的帮助。抱歉代码很长。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct {
    int active;
    int team;
    int number;
    int health;
    char type;
    int speed;
    int stunned;
    int move1effect;
    int move2effect;
    int move3effect;
    int move4effect;
    int move1dmg;
    int move2dmg;
    int move3dmg;
    int move4dmg;
    int move1hitchance;
    int move2hitchance;
    int move3hitchance;
    int move4hitchance;
    char move1name[50];
    char move2name[50];
    char move3name[50];
    char move4name[50];
    char move1type;
    char move2type;
    char move3type;
    char move4type;
} playerdata;

playerdata addPlayer(int selection, int team, int number){

}

void moveprompt(playerdata* p){

}

void moveeffect(playerdata* cP, int target, playerdata* pptr[], int damagemultiplier, int miss, int movehitchance, int movedmg, char movename[], int moveeffect){

}

}
void maketurn(playerdata* cP, int currentP, int sel, int target, playerdata* pptr[]){

}

void printplayerstatus(playerdata* pptr[], int playercount){
       
}


int main(){
int c= 1;
srand(time(NULL));
FILE* file = fopen("file.bin", "wb");
if (file == NULL){
printf("Error opening file");
return 1;
}
int playercount=0;
int numofplayers=0;
int numofcpus=0;

int gametype;
playerdata* ptr[50];
playerdata p[50];
printf(
    "Start new game or load previous save?\n"
    "1: Start new game\n"
    "2: Load previous save\n"
);
scanf("%d",&gametype);

if(gametype == 1){
int selection = 0, team = 0;
 
    printf("How many player characters?(1-5)\n");
    scanf("%d", &numofplayers);

    printf("How many computer players?(1-5)\n");
    scanf("%d", &numofcpus);
    
    playercount = numofplayers + numofcpus;
    //playerdata p[playercount];
    for(int i = 0; i<playercount; i++){
        ptr[i] = &p[i];
    }
    for(int i = 0; i<numofplayers; i++){
    printf("Player %d: Select a Character\n"
            "1: Charmander (Fire type, 2x Damage to Bulbasaur)\n"
            "2: Bulbasaur (Grass type, 2x Damage to Squirtle)\n"
            "3: Squirtle (Water Type, 2x Damage to Charmander)\n", i+1
            );
    scanf("%d", &selection);
    team = 1;
     p[i] = addPlayer(selection, team, i+1);
    }
   
    for(int i = 0; i<numofcpus; i++){
    selection = 0, team = 0;

    int r = rand() % 3;
    selection = (r+1);
    team = 2; 
     p[i+numofplayers] = addPlayer(selection, team, (i+1)+numofplayers);
    }
}

if(gametype == 2){
    int eof=0;
    while(!eof){
        fread(&playercount, sizeof(int),1,file);
        //playerdata p[playercount];
        printf("Playercount: %d\n",playercount);
        
        for(int i = 0; i<playercount; i++){
            ptr[i]=&p[i];
        }
        fread(p, sizeof(playerdata),playercount,file);
        eof=feof(file);
    }
}

playerdata* pptr[playercount];
    for(int i = 0; i<playercount; i++){
        pptr[i] = ptr[i];
    }

playerdata* turnptr[playercount];

for(int i = 0; i<playercount; i++){
turnptr[i]= pptr[i];
}


while(c==1){//main game loop as long as 1 team is alive
int team1Alive = 0;
int team2Alive = 0;
for(int i = 0; i<playercount; i++){
    if(turnptr[i]->active == 1){
        if(turnptr[i]->health > 0){
             if(turnptr[i]->team == 1){
                team1Alive = 1;
            }else if (turnptr[i]->team==2){
                team2Alive= 1;
            }
            printplayerstatus(pptr, playercount);  
            
            if(turnptr[i]->stunned != 1){
                    
                int sel = 0;
                int target = 0;
                printf("\nPLAYER %d'S TURN:\n",turnptr[i]->number);
                moveprompt(turnptr[i]);
                if(turnptr[i]->team == 1){
                    
                    scanf("%d", &sel);
                   if(sel==5){
                    printf("saving...\n");
                    fwrite(&playercount, sizeof(int), 1, file);
                    for(int i = 0; i<playercount; i++){
                        fwrite(pptr[i],sizeof(playerdata),1,file);
                    }
                    
                    printf("Wrote to file successfully.\n");
                    return 0;
                   }
                    if(sel!=4){
                        printf("Who to attack? (Enter player number) \n");
                        scanf("%d",&target);
                    }
                }else if (turnptr[i]->team == 2){
                    sel = ((rand() % 4)+1);
                    target = ((rand() % 2)+1);
                }

            maketurn(turnptr[i],turnptr[i]->number, sel, target, pptr);
        
            }else if(turnptr[i]->stunned == 1){
                printf("Player %d is stunned and cannot move!\n",turnptr[i]->number);
                turnptr[i]->stunned = 0;
            }
        }//end if hp>0 loop
    }
}

     if(team1Alive != 1){
        printf("Team 2 Wins!\n");
        c=5;
    }
    if(team2Alive != 1){
        printf("Team 1 Wins!\n");
        c=5;
    }
    
}

fclose(file);
return 0;
}


我尝试单独存储每个结构并单独读取每个结构,并调试在加载时打印玩家计数,但每次玩家计数读取为 0,所以我想知道它是否未正确保存,或者是否保存在整数上与结构。

c struct file-io fwrite fread
1个回答
0
投票

您可以在程序开始时打开文件,如下所示:

FILE* file = fopen("file.bin", "wb");

请注意,“w”作为模式参数将破坏文件内容(如果文件已存在),因此您无法加载任何内容。

https://en.cppreference.com/w/c/io/fopen

© www.soinside.com 2019 - 2024. All rights reserved.