Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将数据从类数组写入二进制文件C++;_C++ - Fatal编程技术网

C++ 将数据从类数组写入二进制文件C++;

C++ 将数据从类数组写入二进制文件C++;,c++,C++,在我的代码中,我有一个类User数组作为类UserManager中的私有变量。调用UserManager::Shutdown()时,它会将用户数组保存到文件中。但是我得到了一个访问冲突错误。fwrite.c中出现访问冲突错误 我正在运行Windows7的VisualStudio2010上编译 用户类 class User { public: User() { memset(username, 0, 255); memset(password, 0, 255); } int us

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

我正在运行Windows7的VisualStudio2010上编译

用户类

class User {
public:
User() {
    memset(username, 0, 255);
    memset(password, 0, 255);
}

int userId;
char username[255];
char password[255];
};
最大用户定义

#define MAX_USERS 2048
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);
}
用户管理器构造函数

UserManager::UserManager() {
memset( users, 0, MAX_USERS);
}
关闭功能

#define MAX_USERS 2048
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);
}
void用户管理器::关机(void){
文件*userDB=fopen(“users.bin”、“wb”);
int k=1;
for(k=1;kuserId,sizeof(int),1,userDB);
fwrite((const void*)用户[k]->用户名,255,1,userDB);
fwrite((const void*)用户[k]->密码,255,1,userDB);
}否则{
fpos_t skip=255+255+sizeof(int);
fsetpos(userDB和skip);
}
}
fclose(userDB);
}
数组“users”在构造函数中被memset为零。

1 循环迭代从1开始,但数组索引从0开始。在没有看到MAX_USERS的定义或实际错误的情况下,我猜您的k值超出了您的USERS数组边界

理论2 您将用户声明为

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 %d\n", users[k]->userId);
            fprintf(stdout, "%s\n", users[k]->username);
            fprintf(stdout, "%s\n", 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;
}
#定义最大用户2048
类用户{
public:User(){
memset(用户名,0255);
memset(密码,0255);}
int用户标识;
字符用户名[255];
字符密码[255];
}; 
无效写文件(用户**用户)
{
文件*userDB=fopen(“users.bin”、“wb”);
intk=0;for(k=0;kuserId,sizeof(int),1,userDB);
fwrite((const void*)用户[k]->用户名,255,1,userDB);
fwrite((const void*)用户[k]->密码,255,1,userDB);
fprintf(stdout,“UserID%d\n”,users[k]->UserID);
fprintf(标准输出,“%s\n”,用户[k]->用户名);
fprintf(标准输出,“%s\n”,用户[k]->密码);
fflush(stdout);
}否则{
fpos_t skip=255+255+sizeof(int);
fsetpos(userDB和skip);
} 
}fclose(userDB);
} 
int _tmain(int argc,_TCHAR*argv[]
{
用户*用户[最大用户]={};
memset(用户,0,最大用户);
用户[0]=新用户();
用户[0]->userId=1;
memcpy(用户[0]->用户名,“BLah”,strlen(“BLah”);
memcpy(用户[0]->密码,“某物:”,strlen(“某物:”);
用户[2]=新用户();
用户[2]->userId=1;
memcpy(用户[2]->用户名,“BLah2”,strlen(“BLah2”);
memcpy(用户[2]->密码,“某物:”,strlen(“某物:”);
可写文件(用户);
返回0;
}

您是否正在初始化所有变量

怀疑是数组造成的。

跳过并重置文件指针位置的else块似乎有问题(请尝试写入“空”记录,而不是跳过)。您是否通过调试器运行它以查看访问冲突的确切位置/时间?如果我们知道如何声明
users
,以及如何初始化,这将有所帮助。我猜:这是一个指向
用户的未初始化指针数组。我让它编写一个空用户,但它仍然给我一个访问冲突。在我更改用户id之前,它是在写入用户id时发生的。users在UserManager的构造函数中被memset设置为0这是一个问题,但不会导致访问冲突错误。如Rob所说。如果我们能看到'users'、'MAX_users'的声明以及'users'是如何初始化/填充的,我真的会很有帮助。所有这些都添加到了OP中。用户添加了RegisterUser()函数,但效果很好。你确定你更改了
int k=1和for循环中的
k=1
?当确保k被初始化为零时,发布的代码似乎起作用。当然,我必须填补一些空白,所以它与您的代码不完全相同。然后将memset设置为零,所以这两种理论都是错误的。我在运行时分析了阵列,for循环和用户都没有问题。问题是二进制文件IO。写入实际数据。