【发布时间】:2021-11-20 14:16:23
【问题描述】:
#include <iostream>
#include <fstream>
using namespace std;
struct review {
string text;
string date;
};
void getRegistry(int i) {
review* reg = new review;
ifstream file;
file.open("test.txt", ios::binary);
if (file) {
file.seekg(i * sizeof(review), ios::beg);
file.read(reinterpret_cast<char*>(reg), sizeof(review));
cout << reg->text;
file.close();
}
delete reg;
}
void generateBinary()
{
ofstream arq("test.txt", ios::binary);
review x;
x.text = "asdasdasd";
x.date = "qweqweqwe";
for (int i = 1; i <= 1000000; i++)
{
arq.write(reinterpret_cast<const char*>(&x), sizeof(review));
}
arq.close();
}
int main() {
generateBinary();
getRegistry(2);
return 0;
}
您好,我正在尝试编写一个程序,它将多个“评论”写入二进制文件,然后读取某个注册表。该程序似乎可以工作,但最后它总是抛出异常:“在 trabalho.exe 中在 0x00007FF628E58C95 抛出异常:0xC0000005:访问冲突读取位置 0xFFFFFFFFFFFFFFFF。”我该如何解决这个问题?谢谢!
【问题讨论】:
-
简单:您可以在调试器中运行它。
-
但问题是您序列化了一个 std::string (我假设;您不包含该标头并且您使用命名空间 std,因此您不告诉我们那是哪个字符串)一个字节一个字节地写出来。您是否知道字符串包含一个成员,该成员是指向特定于正在运行的程序的某个地址的指针?字节图像序列化一开始是个坏主意,因为它取决于编译器选项和系统。但作为第一次尝试,它可以使用固定长度的字符数组而不是字符串。
-
要获得更好(特别是更便携)的选项,请考虑使用序列化库,请参阅here。
-
“程序似乎可以工作”是什么意思?您的意思是它以您期望的格式(并且您可以再次阅读)正确地将一百万条“评论”写入文件 test.txt?请尽可能清楚地描述实际和期望的行为。
标签: c++