我的C++程序在尝试输出从文件中读取的数据时崩溃

My C++ program crashes when trying to output data read from a file

本文关键字:读取 数据 崩溃 文件 程序 C++ 输出 我的      更新时间:2023-10-16

我正在尝试制作一个程序来存储员工数据库并将其存储在外部文件中。 从.dat文件中读取矢量并将其加载到程序中的函数读取文件,但每当我尝试显示或修改加载的矢量时,程序都会崩溃。

//displays vector
void Database:: displayAll() const
{
for(std::vector<Employee>::const_iterator iter = mEmployees.begin(); iter != mEmployees.end(); ++iter)
{
iter -> display();
}
}
std::vector<Employee> mEmployees;
void Database::readData()
{
ifstream empIn("employee.dat" , ios::binary);
empIn.seekg(0,ifstream::end);
long size2 = empIn.tellg();
empIn.seekg(0,ifstream::beg);
mEmployees.resize(size2);
empIn.read((char*)&mEmployees, size2);
empIn.close();
cout << mEmployees.size() << endl; //this tests whether or not it reads.
}

你还没有向我们展示你的mEmployees声明,但我认为这是某种std::vector。问题是您正在尝试将文件读入vector对象,而不是其内容。这将损坏vector,以及它旁边的任何其他内存,从而导致进一步崩溃。

您可能想要的是:

empIn.read((char*)&mEmployees[0], size2);

或在C++11中:

empIn.read((char*)mEmployees.data(), size2);

将文件的内容实际读取到vector的内容中。

要理解为什么会发生这种情况,您应该知道vector的内容并不存储在vector本身中(它们怎么可能?大小是动态的)。相反,vector的常见实现具有指向存储区域的开始和结束的指针,即免费商店中的某个位置,内容实际保存在那里。当您尝试将文件读入vector的内存布局时,您将覆盖这些指针以及超出vector本身的内存,从而损坏矢量等。

(char*)的强制转换告诉编译器放弃它通常会执行的类型检查。 在这种情况下,有必要执行强制转换,因为ifstream要求您通过char*。 问题是,这个reinterpret_cast是一个相当生硬的工具,当您打算从Employee*转换时,无法警告您正在从vector<Employee>*转换。

请记住,像这样的强制转换是低级操作,其目的是告诉编译器"你知道你在做什么,即使它看起来是错误的"。 使用时应格外小心。

对于您正在做的事情,一个更好且更正的形式是:

empIn.read( reinterpret_cast<char*>(&mEmployees[0]), mEmployees.size() );