2016-12-24 10 views
-1

コード実行に奇妙なことがあります player_countの値を除いてすべてが正常になります。名前と電子メールは正しく更新されますが、私はファイルからデータを再度読み取ると、まだ0です。 なぜplayer_countはまだ0に等しいか??????ここデータベースの混乱

コードです:私は、Linuxでこのプログラムをしようとすると

#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

それは、私が最終的にバグを見つけ正しく
を実行します。 Windowsではfreadは次のようなバイナリモードで開きます:

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