我正在尝试将一个结构写入文件并将其读回。这样做的代码在这里:
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;
struct info {
int id;
string name;
};
int main(void) {
info adam;
adam.id = 50;
adam.name = "adam";
ofstream file("student_info.dat", ios::binary);
file.write((char*)&adam, sizeof(info));
file.close();
info student;
ifstream file2("student_info.dat", ios::binary);
file2.read((char*)&student, sizeof(student));
cout << "ID =" << student.id << " Name = " << student.name << endl;
file2.close();
return 0;
}
然而我最终遇到了一个奇怪的分段错误。
输出是:
ID =50 Name = adam
Segmentation fault (core dumped)
在查看核心转储时,我发现结构信息的破坏发生了一些奇怪的事情。
(gdb) bt
#0 0x00007f035330595c in ?? ()
#1 0x00000000004014d8 in info::~info() () at binio.cc:7
#2 0x00000000004013c9 in main () at binio.cc:21
我怀疑字符串破坏中发生了一些奇怪的事情,但我无法找出确切的问题。任何帮助都会很棒。
我正在使用 gcc 8.2.0。
你不能像那样序列化/反序列化。在此行:
file2.read((char*)&student, sizeof(student));
你只是在一个实例上写 1:1info
,其中包括一个std::string
。这些不仅仅是字符数组 - 它们在堆上动态分配存储空间并使用指针进行管理。因此,如果您像这样覆盖它,该字符串将变得无效,这是未定义的行为,因为它的指针不再指向有效的位置。
相反,您应该保存实际的字符,而不是字符串对象,并在加载时使用该内容创建一个新字符串。
一般来说,您可以对琐碎的对象进行类似的复制。你可以这样测试:
std::cout << std::is_trivially_copyable<std::string>::value << '\n';
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)