从二进制文件读取会让我违反访问
Reading from a binary file gives me access violation
嗨,我是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]
这样的东西就可以了。
相关文章:
- 正在读取二进制文件(is_open)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 保存/加载大量短数组到二进制文件
- 从二进制文件中读取整数数组
- Android 在编译二进制文件时重建静态库
- 在 C++ 中将双精度变量写入二进制文件
- clang 的 libFuzzer 可以在同一二进制文件中测试超过 1 个 API 吗?
- 从二进制文件中读取元素时引发异常(引发异常:读取访问冲突. _Pnext 0xB414D4)
- 如何在Android中从本机编译的c ++二进制文件访问相机
- 使用MMAP与FSTREAM或FOPEN访问二进制文件
- 随机访问文件格式,用于分层组织的二进制文件和文本文件
- 系统访问出界异常,尝试从flatbuffer的二进制文件访问"LengthofTable"
- 使用二进制文件访问违规读取位置
- C++:使用std::ifstream读取二进制文件后删除缓冲区/指针时发生访问冲突
- 无法从我的二进制文件访问远程服务器中的数据库
- 从二进制文件读取会让我违反访问
- 从 Web UI 访问C++编译的可执行二进制文件
- 从二进制文件获取输入时发生访问冲突错误
- 是否有可能在Android中通过编译二进制文件生成本地缓冲区溢出来获得根访问权限?