从二进制文件读取会让我违反访问

Reading from a binary file gives me access violation

本文关键字:访问 二进制文件 读取      更新时间:2023-10-16

嗨,我是C++新手,我正在尝试将数据从结构写入二进制文件,然后读取文件并将数据存储回结构中。以下是我到目前为止所做的:

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
struct Data{
    string name;
    int points[6];
};
int main(){
    Data stream[20];
    Data my[20];
    for (int i = 0; i < 20; i++){
        stream[i].name = "name" + to_string(i);
        for (int j = 0; j < 6; j++)
        {
            stream[i].points[j] = j + i;
        }
    }
    ofstream writer("data.dat", ios::binary | ios::trunc);
    if (writer.is_open()){
        writer.write((char *)stream, sizeof(stream));
        writer.close();
    }
    else cout << "Error opening file.n";
    ifstream reader("data.dat", ios::binary);
    if (reader.is_open()){
        reader.read((char *)my, sizeof(my));
        reader.close();
    }
    else cout << "Error opening file.n";
    for (int i = 0; i < 20; i++){
        cout << my[i].name;
        for (int j = 0; j < 6; j++)
        {
            cout << " " << my[i].points[j];
        }
        cout << endl;
    }
    system("pause");
    return 0;
}

当我编译它时,一切都可以正常工作。数据显示正确,当我按下按钮通过系统("暂停"(BOOM 访问违规时。我做错了什么?

您实际上是在双重删除字符串。字符串不是普通的旧数据,您实际上不能只是将其写入文件并从中读取,它是一个由对象管理的动态分配的字符数组。 ~string()将释放它拥有的内存。

当您按字节复制 string s 时(您正在有效地执行此操作(,您有两个对象都认为它们拥有相同的数据 - 因此当它们超出范围时,它们都试图释放它。因此,繁荣。您可以在此处实现相同的操作:

{
    std::string test = "hi";
    std::string t2;
    memcpy(&t2, &test, sizeof(std::string));
} // <-- death

如果要像这样读取二进制数据,则必须使用 POD 类型。像char name[30]这样的东西就可以了。