0xC0000005 读取二进制文件时抛出异常(C++)

Posted

技术标签:

【中文标题】0xC0000005 读取二进制文件时抛出异常(C++)【英文标题】:0xC0000005 Exception thrown when reading binary file (C++) 【发布时间】:2021-04-16 00:28:58 【问题描述】:

我正在尝试让用户登录和注册系统使用二进制文件来保存数据,并检查用户名和密码是否与保存的相同。当 Create_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();

【问题讨论】:

这行不通。你不能像这样保存不可复制的类型。 Filesstd::string 成员、用户定义的析构函数等。查找 object serialization。如果您仔细查看 sizeof(Files),这是行不通的。如果其中一个字符串代表 1000 个字符怎么办?你认为sizeof(Files) 会是 1000 或更大吗?没有。 另外,谁或什么建议读/写二进制文件?我在 SO 上多次看到此错误,有人或某些材料将其视为可行的方法。是的,它是可行的,但前提是所存储的类型可以简单复制并且不包含指针。 不相关的有趣事实:struct 默认为 public。无需声明一切public 我看到你正在读取一个字符数组。但是查看您的代码,您似乎使用了一些(错误的)代码,错误地尝试读取/写入 File 对象,并且完全忘记删除 sizeof(Files) 并将其替换为 sizeof(password) 是的,已解决,谢谢。将 sizeof(Files) 更改为 sizeof(username)sizeof(password) 工作 【参考方案1】:

异常已解决。通过改变

ReadFile.read(reinterpret_cast<char*>(&username), sizeof(Files)); 
ReadFile.read(reinterpret_cast<char*>(&password), sizeof(Files));
 

 ReadFile.read(reinterpret_cast<char*>(&username), sizeof(username)); 
 ReadFile.read(reinterpret_cast<char*>(&password), sizeof(password));

感谢您的信息

【讨论】:

很高兴您得到了解决方案,感谢您的分享,如果您将它们标记为答案,我将不胜感激,这将对其他社区有益。

以上是关于0xC0000005 读取二进制文件时抛出异常(C++)的主要内容,如果未能解决你的问题,请参考以下文章

来自 JNI_CreateJavaVM (jvm.dll) 的异常 0xC0000005

无法在 C# 中捕获 0xC0000005 异常

task2.exe 中 0x001066F6 处未处理的异常:0xC0000005:访问冲突读取位置 0x0000000C [关闭]

C++:XY.exe 中 0x0b9ec715 (XX.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000004

0x5746723c (msvcr100d.dll) 处最可能的异常: 0xC0000005: 读取位置 0xccccccc8 时发生访问冲突

有未经处理的异常: 0xC0000005: 读取位置 0xFFFFFFFC 时发生访问冲突