【发布时间】:2019-06-19 01:34:31
【问题描述】:
我正在尝试从已写入 Person 对象的 Person.txt 文件中读取。我收到此错误:抛出异常:读取访问冲突。 _Pnext 是 0x87E504。
我试过调试,它执行的功能很好。只有在函数完成后才会弹出错误。
这是我从文件中读取的代码:
void readFromFile()
{
ifstream inFile("Person.txt", ios::in);
Person p2;
inFile.read(reinterpret_cast<char*>(&p2), sizeof(Person));
cout << "First Name: " << p2.getFirst() << endl
<< "Last Name: " << p2.getlast() << endl
<< "Gender: " << p2.getgender() << endl
<< "Age: " << p2.getAge() << endl;
}
人物类:
Class Person {
public:
Person()
{
firstName = "N/A";
lastName = "N/A";
gender = "N/A";
age = 0;
}
Person(std::string first, std::string last, std::string gender, int age)
{
firstName = first;
lastName = last;
this->gender = gender;
this->age = age;
}
~Person()
{
std::cout << "Person Destructor" << std::endl;
}
void setFirst(std::string first)
{
firstName = first;
}
std::string getFirst() const
{
return firstName;
}
void setLast(std::string last)
{
lastName = last;
}
std::string getlast() const
{
return lastName;
}
void setGender(std::string gender)
{
this->gender = gender;
}
std::string getgender() const
{
return gender;
}
void setAge(int age)
{
this-> age = age;
}
int getAge() const
{
return age;
}
private:
std::string firstName;
std::string lastName;
std::string gender;
int age;
};
【问题讨论】:
-
Person的声明实际上是什么样的?我怀疑它包含指向动态分配数据的指针,例如std::string数据成员内部。如果是这样,那么您将无法按原样写入/读取Person对象,您将需要单独序列化成员。 -
我编辑它以显示 Person 类!
-
任何时候你
reinterpret_cast你都知道你的代码是错误的。在这种情况下,完全错误。 -
@AdamWinters 这很奇怪,因为我正在按照我的教科书做,而这正是他们所做的。 -- 所以多年来一直萦绕在我脑海中的谜团最终可能是解决了。你不是唯一一个以这种方式编写代码的人,我一直想知道是谁或什么在教这种方法。有数千个问题被标记为 C++ 与相同的问题,这种错误的技术不可能只是被粗心的语言学习者随机挑选出来的。
-
@RemyLebeau 这是真的吗?您是否保证
gender和age之间的填充不会随编译标志、编译器版本或其他内容而改变?您是否保证age的字节表示不会随 CPU 版本、操作系统版本或其他内容而改变?它可能有效,但也可能无效,在书中教人们以这种方式编码是鲁莽的。