从类数组写入数据到二进制文件

Writing Data from an Array of Classes to a Binary File C++

本文关键字:数据 二进制文件 数组      更新时间:2023-10-16

在我的代码中,我有一个类User的数组作为类UserManager中的私有变量。当UserManager::Shutdown()被调用时,它将用户数组保存到一个文件中。但是我得到了一个访问冲突错误。在fwrite.c

中发生访问冲突错误。

我在Visual Studio 2010上编译,运行Windows 7。

用户类

class User {
public:
User() {
    memset(username, 0, 255);
    memset(password, 0, 255);
}
int userId;
char username[255];
char password[255];
};

MAX_USERS定义

#define MAX_USERS 2048

用户管理器构造函数

UserManager::UserManager() {
memset( users, 0, MAX_USERS);
}
<<p> 关闭功能/strong>
void UserManager::Shutdown( void) {
FILE *userDB = fopen( "users.bin", "wb");
int k=1;
for(k=1;k<MAX_USERS-1;k++){
    if (users[k]!=NULL) {
        fwrite((const void*)&users[k]->userId, sizeof(int), 1, userDB);
        fwrite((const void*)users[k]->username, 255, 1, userDB);
        fwrite((const void*)users[k]->password, 255, 1, userDB);
    } else {
        fpos_t skip = 255 + 255 + sizeof(int);
        fsetpos( userDB, &skip);
    }
}
fclose( userDB);
}

数组'users'在构造函数处被memset为零。

理论1

你的循环迭代从1开始,但是数组索引从0开始。没有看到MAX_USERS的定义或实际错误,我的猜测是您的k值超出了您的用户数组边界。

理论2

你声明users为

User *users[MAX_USERS] = {};

那么您在创建每个用户时没有新建它们。所以,不用

users[index] = new User();

你做

  User user1;
  users[index] = &user1;

第二个版本可能会超出范围。然后user1的内存将被重新分配到其他地方,当你试图通过users[k]->访问它时,你会得到访问冲突。

我的版本下面是我用来解决问题的代码。它是快速和肮脏的,我填补空白,但它运行到完成。希望对你有帮助。
#define MAX_USERS 2048
class User { 
    public: User() {     
    memset(username, 0, 255);     
    memset(password, 0, 255); }  
    int userId; 
    char username[255]; 
    char password[255]; 
}; 
void writefile( User **users)
{
    FILE *userDB = fopen( "users.bin", "wb"); 
    int k=0; for(k=0;k<MAX_USERS-1;k++){     
        if (users[k]!=NULL) {         
            fwrite((const void*)&users[k]->userId, sizeof(int), 1, userDB);         
            fwrite((const void*)users[k]->username, 255, 1, userDB);         
            fwrite((const void*)users[k]->password, 255, 1, userDB);     
            fprintf(stdout, "UserID %dn", users[k]->userId);
            fprintf(stdout, "%sn", users[k]->username);
            fprintf(stdout, "%sn", users[k]->password);
            fflush(stdout);
        } else {         
            fpos_t skip = 255 + 255 + sizeof(int);         
            fsetpos( userDB, &skip);     
        } 
    }  fclose( userDB); 
} 
int _tmain(int argc, _TCHAR* argv[])
{
    User *users[MAX_USERS] = {};
    memset(users, 0, MAX_USERS);
    users[0] = new User();
    users[0]->userId = 1;
    memcpy(users[0]->username,"BLah", strlen("BLah"));
    memcpy(users[0]->password,"something:", strlen("something:"));
    users[2] = new User();
    users[2]->userId = 1;
    memcpy(users[2]->username,"BLah2", strlen("BLah2"));
    memcpy(users[2]->password,"something:", strlen("something:"));
    writefile(users);
    return 0;
}

是否初始化了所有变量?