我的C++程序在尝试输出从文件中读取的数据时崩溃
My C++ program crashes when trying to output data read from a file
我正在尝试制作一个程序来存储员工数据库并将其存储在外部文件中。 从.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() );
相关文章:
- 如何在ros2中从rosbag2读取数据
- OpenCV 和从 OutputArrays 或 (Mat) 读取数据
- 使用C++从磁卡读卡器MT188读取数据
- HDF5 简单读取数据集失败
- 嵌套结构,从由空行分隔的文件中读取数据
- 不要从输入队列套接字读取数据
- 从文件中读取数据,操作员>>
- 如何从excel文件中读取数据并存储到变量中?
- C++:从文件中读取x y数据会产生无限循环吗
- 无法通过FT232RL读取数据
- 如何从QNetworkReply读取数据?
- C++ 逐行从文件(包含空格)读取数据
- 通过显示一行星号来创建条形图,该条形图将读取数据的输入文件
- 我们可以从 TXT 文件中读取数据并使用 C 和 C++ 将其保存到 SQL 数据库吗?
- 从多个 tcp 连接读取数据
- 从文本文件中读取数据并删除所有换行符空格,并在 C++ 控制台中显示
- Qt TCP服务器不从客户端读取数据
- 累积从 C++11 中的文件中读取数据的整数
- 从 txt 文件中读取数据的最简单方法
- 从 txt 文件中读取数据的 Getline