一旦loadInventoryData函数终止,我的程序就会一直以访问冲突错误终止:
CIS2252编程Project.exe中0x0F9BCCC8(msvcp110d.dll)的未处理异常:0xC0000005:访问冲突读取位置0x007DD314。
调用堆栈:
msvcp110d.dll!std::_Container_base12::_Orphan_all() Line 216 C++
CIS2252 Programming Project.exe!std::_String_alloc<0,std::_String_base_types<char,std::allocator<char> > >::_Free_proxy() Line 680 C++
CIS2252 Programming Project.exe!std::_String_alloc<0,std::_String_base_types<char,std::allocator<char> > >::~_String_alloc<0,std::_String_base_types<char,std::allocator<char> > >() Line 656 C++
CIS2252 Programming Project.exe!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> >() Line 965 C++
CIS2252 Programming Project.exe!loadInventoryData(std::vector<InventoryItem,std::allocator<InventoryItem> > & invMast) Line 220 C++
CIS2252 Programming Project.exe!main() Line 45 C++
CIS2252 Programming Project.exe!__tmainCRTStartup() Line 536 C
CIS2252 Programming Project.exe!mainCRTStartup() Line 377 C
它终止的代码部分是:
void loadInventoryData(vector<InventoryItem> &invMast)
{
// Loads invmast.dat or creates one if none exists
fstream invFile;
invFile.open("invmast.dat", ios::in | ios::binary);
if (!invFile)
{
cerr << "WARNING: Unable to open file invmast.dat, no inventory records loaded!" << endl;
}
else
{
cout << "File invmast.dat opened successfully." << endl;
string itemName;
int itemQuantity;
double itemPrice;
while (invFile && !invFile.eof())
{
invFile.read(reinterpret_cast<char *>(&itemName), sizeof(itemName));
invFile.read(reinterpret_cast<char *>(&itemQuantity), sizeof(itemQuantity));
invFile.read(reinterpret_cast<char *>(&itemPrice), sizeof(itemPrice));
invMast.emplace_back(itemName, itemQuantity, itemPrice); // Create element using constructor with data loaded into invLoader
}
}
}
在我的Main中,在函数调用之前,这些是我的向量声明:
vector <InventoryItem> invMast;
vector <Customer> custMast;
vector <CustRequest> custRequest;
我完全失去了...我会感激任何人都可以做的事情来帮助确定原因。
我使用的是Visual Studio 2012 Professional。
编辑:
感谢大家的帮助。
我发现了一篇关于在二进制文件中使用字符串的非常好的概述: http://www.cplusplus.com/articles/DzywvCM9/
答案 0 :(得分:5)
您错误地使用了string
。在这一行:
invFile.read(reinterpret_cast<char *>(&itemName), sizeof(itemName));
重新解释itemName
并在其上使用sizeof
是错误的。您不能像string
数组一样使用char
类型。这应该可以解决:
itemName.reserve(1024); // or some other size
invFile.read(itemName.c_str(), itemName.capacity());
方法reserve()
为您分配一块内存,c_str()
为您提供指向字符串的C样式指针,capacity()
为您提供内存大小刚刚保留。
不确定这是最好的解决方案,您可能需要char
数组。
答案 1 :(得分:1)
此行看起来不对
invFile.read(reinterpret_cast<char *>(&itemName), sizeof(itemName));
sizeof(itemName)使用那种方式不返回字符串的容量,堆栈跟踪也抱怨字符串分配