C++ 读取二进制文件(C+;+;)时引发0xC0000005异常
我正在尝试让用户登录和注册系统使用二进制文件来保存数据,并检查用户名和密码是否与保存的相同。在调用C++ 读取二进制文件(C+;+;)时引发0xC0000005异常,c++,windows,visual-studio,binaryfiles,C++,Windows,Visual Studio,Binaryfiles,我正在尝试让用户登录和注册系统使用二进制文件来保存数据,并检查用户名和密码是否与保存的相同。在调用Create\u Login()和Write()时,甚至在调用Login()之后,它似乎都可以正常工作。当自己调用Login()时会出现问题。尝试读取用户名和密码时引发异常。我已经试着修复了一段时间,只是看不到它。任何帮助都将不胜感激 这是我的密码 Main.cpp int input; cin >> input; switch (input) { case 1:
Create\u Login()
和Write()
时,甚至在调用Login()
之后,它似乎都可以正常工作。当自己调用Login()
时会出现问题。尝试读取用户名和密码时引发异常。我已经试着修复了一段时间,只是看不到它。任何帮助都将不胜感激
这是我的密码
Main.cpp
int input;
cin >> input;
switch (input) {
case 1:
file.Login("");
break;
case 2:
file.Create_Login();
break;
}
.h文件
struct Files {
char username[50];
char password[50];
string CheckPassword;
string CheckUsername;
public:
void Write(string name);
void Login(string name);
void Create_Login();
Files();
~Files();
public:
ifstream ReadFile; // Read
ofstream WriteFile; // Write
};
.cpp文件
Files::Files() {}
void Files::Login(string name) {
cout << "\nEnter Username: " << flush; cin >> CheckUsername;
cout << "Enter Password: " << flush; cin >> CheckPassword;
name = CheckUsername;
ReadFile.open(name + ".bin", ios::out | ios::binary);
cout << "Your Username is: " << CheckUsername << ", " << "Your Password is: " << CheckPassword << endl; // debug line
if (ReadFile.is_open()) {
cout << "Opened file " + name + ".bin" << endl;
ReadFile.read(reinterpret_cast<char*>(&username), sizeof(Files)); //Execption Thrown Here!!!!!
ReadFile.read(reinterpret_cast<char*>(&password), sizeof(Files));
if (CheckUsername == username && CheckPassword == password) {
cout << "Access Granted" << endl;
}
else if (CheckUsername != username && CheckPassword != password) {
cout << "Access Denined" << endl;
}
else {
cout << "Error!!!" << endl;
}
}
else {
cout << "Could not open file: " + name << endl;
cout << "File does not exist" << endl;
}
}
void Files::Create_Login() {
cout << "Create UserName >> " << flush; cin >> username;
cout << "\nCreate Password >> " << flush; cin >> password;
Write(username);
}
void Files::Write(string name) {
WriteFile.open(name + ".bin", ios::binary);
if (WriteFile.is_open()) {
WriteFile.write(reinterpret_cast<char*>(&username), sizeof(Files));
WriteFile.write(reinterpret_cast<char*>(&password), sizeof(Files));
WriteFile.close();
}
else {
cout << "could not create file: " << name + ".bin" << endl;
}
Login(username);
}
Files::~Files() {
cout << "Destructor Called" << endl;
ReadFile.close();
}
Files::Files(){}
void Files::Login(字符串名称){
无法检查用户名;
无法检查密码;
name=CheckUsername;
ReadFile.open(name+“.bin”,ios::out | ios::binary);
无法异常已解决。通过更改
ReadFile.read(reinterpret_cast<char*>(&username), sizeof(Files));
ReadFile.read(reinterpret_cast<char*>(&password), sizeof(Files));
ReadFile.read(reinterpret_cast(&username),sizeof(Files));
ReadFile.read(reinterpret_cast(&password),sizeof(Files));
到
ReadFile.read(reinterpret_cast(&username),sizeof(username));
ReadFile.read(reinterpret_cast(&password),sizeof(password));
感谢您提供的信息这将不起作用。您无法保存像这样的可复制类型。文件
具有std::string
成员、用户定义的析构函数等。请查找。如果仔细查看sizeof(文件),这将不起作用
。如果其中一个字符串代表1000个字符怎么办?您认为sizeof(Files)是
将是1000或更大?否。另外,谁或什么人建议读/写二进制文件?我多次看到这个错误,因此,有人或某些材料认为这是一个可行的方法。是的,它是可行的,但只有在存储的类型可以复制且不包含指针的情况下。不相关的有趣事实:struct
默认值到public
。无需声明所有内容public
我看到您正在读取字符数组。但查看您的代码,您似乎使用了一些(错误的)代码,错误地尝试读取/写入文件
对象,完全忘记删除大小(文件)
并将其替换为大小(密码)
。是的,修复了,谢谢。将sizeof(文件)
更改为sizeof(用户名)
和sizeof(密码)
工作我很高兴您得到了解决方案,感谢您的分享,如果您将它们标记为答案,我将不胜感激,这将对其他社区有益。
ReadFile.read(reinterpret_cast<char*>(&username), sizeof(username));
ReadFile.read(reinterpret_cast<char*>(&password), sizeof(password));