2016-12-24 96 views
-1

我在執行代碼時遇到了一件奇怪的事 除了player_count的值之外,其他事情都沒有問題。當我從文件中再次讀取數據時,儘管名稱和電子郵件已正確更新,但它仍然爲0。 爲什麼player_count仍然等於0 ??????數據庫混淆

這裏是代碼:

#define MAX_DATA 128 
#define STRLEN 101 
#define FILENAME "C:\\Users\\ahmed\\Desktop\\C codes\\new_game\\data_base.dat" 
typedef struct 
{ 
char name[STRLEN] ; 
char email[STRLEN] ; 
int score ; 
int id ; 
int Set ; 
} player_t ; 

typedef struct 
{ 
    player_t player[MAX_DATA] ; 
    int player_count ; 
}DataBase ; 

typedef struct 
{ 
    DataBase db ; 
    FILE *filename ; 

}Connection ; 

void Store_Player_Database(int score) 
{ 

Connection *conn = Creat_Connection(FILENAME); 
player_t *player = conn->db.player ; 

Read_Database(conn) ; 

int player_num = conn->db.player_count ; 

printf("Your name : ") ; 
get_str(player[player_num].name , STRLEN) ; 
printf("Your e-mail : ") ; 
get_str(player[player_num].email , STRLEN) ; 
player[player_num].Set = 1 ; 
player[player_num].score = score ; 
conn->db.player_count++ ; 
printf("count here = %d\n",conn->db.player_count) ; 
Write_Database(conn) ; 

} 

Connection *Creat_Connection(const char *filename) 
{ 
Connection *conn = calloc(1,sizeof(Connection)) ; 
//check_mem(conn) ; 

int i = 0; 
for(i = 0 ; i< MAX_DATA ; i++) 
    conn->db.player[i].id = i+1 ; 

/// for update or read 

    conn->filename = fopen(filename , "r+") ; 
    //check(db->filename , "File open failed !") ; 

    return conn ; 
} 

int Read_Database(Connection *conn) 
{ 

int rc ; 
if(conn) 
{ 
    if(conn->filename) 
    { 

     DataBase *db = &conn->db ; 
     rc=fread(db,sizeof(DataBase),1,conn->filename); // load database from file . 
     printf("count = %d\n" , db->player_count) ;printf("%s %s \n" , db->player[0].name , db->player[0].email); 
     /* if (rc != 1) 
     { 
      printf("Error load database from file\n") ; 
      return -1 ; 
     }*/ 

    } 
} 
return 1 ; 
} 


int Write_Database(Connection *conn) 
{ 

int rc ; 
if(conn) 
    { 
    if(conn->filename) 
    { 
      rewind(conn->filename) ; 
      DataBase *db = &conn->db ;printf("%s %s count = %d \n" , db->player[0].name , db->player[0].email , conn->db.player_count); 
      rc = fwrite(db,sizeof(DataBase),1,conn->filename) ; 
      if (rc != 1) 
      { 
      printf("Error load database from file\n") ; 
      return -1 ; 
      } 
      fflush(conn->filename) ; 

    } 

} 
return 1 ; 
} 

/*****************************/ 
int main(void) 
{ 
    int score = 5 ; 

    /* any code here */ 

    Store_Player_Database(score) ; 
    Store_Player_Database(score +1) ; // at that call i get name and mail correct but player_count still zero ??? why?! 

    return 0 ; 
} 

回答

0

當我在linux試試這個程序運行正常
後來我發現的bug終於。 在windows fread應該以如下二進制模式打開:

conn->filename = fopen(filename , "rb+") ; // use rb+ instead of r+ to open it in binary mode