从类数组写入数据到二进制文件
Writing Data from an Array of Classes to a Binary File C++
在我的代码中,我有一个类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;
}
是否初始化了所有变量?
相关文章:
- 如何使用位字段将数据从二进制文件复制到结构中?
- C++ 尝试优化每一帧将数据打印到二进制文件
- 如何在二进制文件上附加数据?
- 在二进制文件中写入对齐的数据
- 如何在二进制文件中组织数据?
- Python API用于解析包含数组格式的protobuf数据的二进制文件
- 使用平面缓冲区读取以前写入的二进制文件的数据
- 如何仅使用 std::filebuf 将数据(二进制模式)写入文件
- 如何从 linux 二进制文件中存储和检索数据
- 二进制文件中的某些数据如图所示,并以奇怪的方式显示OS
- 如何在结构中存储二进制文件数据
- 保存和加载类数据存储在C 中的二进制文件中
- 通过Google Protobuf发送二进制文件数据
- 从二进制文件C++更新数据
- 在C++中使用 CArchive 类从二进制文件中读取短数据
- 如何使用dlang读取二进制文件数据
- 将敏感数据存储在C 编译的二进制文件中是否安全
- 检测二进制文件数据的端性
- 在 VC++ 中将类数据读取和写入二进制文件
- 用于存储数据的结构和外部二进制文件