[英]Writing Data from an Array of Classes to a Binary File C++
在我的代碼中,我將User類的數組作為UserManager類中的私有變量。 調用UserManager :: Shutdown()時,它將用戶數組保存到文件中。 但是我收到訪問沖突錯誤。 fwrite.c中發生訪問沖突錯誤
我正在運行Windows 7的Visual Studio 2010上進行編譯。
用戶類別
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);
}
關機功能
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);
}
數組“用戶”在構造函數中被設置為零。
您的循環迭代從1開始,但數組索引從0開始。在沒有看到MAX_USERS的定義或實際錯誤的情況下,我的猜測是您的k值超出了用戶數組邊界。
您將用戶聲明為
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;
}
您是否正在初始化所有變量?
懷疑是數組是原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.