在下面的类错误是在init函数中,我将存储在文件中的类对象加载到矢量项。
class Item
{
std::string item_code;
std::string item_name;
std::string unit_name;
unsigned int price_per_unit;
double discount_rate;
static std::vector<Item> Items;
friend std::ostream& operator<< (std::ostream&, Item&);
public:
static void PrintAll();
static void Init();
~Item();
};
默认构造函数是从用户读取数据并写入文件的构造函数。下面是默认构造函数的代码。
Item::Item(int a)
{
std::cout << "Item name : ";
std::getline(std::cin, item_name);
std::cout << "Unit (Kg/g/Qty) : ";
std::getline(std::cin, unit_name);
std::cout << "Price per unit : ";
std::cin >> price_per_unit;
std::cout << "Discount Rate : ";
std::cin >> discount_rate;
std::cin.ignore();
std::cout << "Product code (has to be unique) : ";
std::getline(std::cin, item_code);
std::ofstream outfile;
outfile.open("Files\\Items.txt", std::ios::out | std::ios::app);
outfile.write((char*)&(*this), sizeof(Item));
outfile.close();
}
下面是抛出读访问冲突的Init()函数。
void Item::Init()
{
std::ifstream infile("Files\\Items.txt", std::ios::in);
if (!infile.is_open())
{
std::cout << "Cannot Open File \n";
infile.close();
return;
}
else
{
Item temp;
while (!infile.eof())
{
infile.read((char*)&temp, sizeof(temp));
Item::Items.push_back(temp);
}
}
infile.close();
}
即使我正在检查eof,也会抛出读取访问冲突。请就这个问题给我一些建议。
答案 0 :(得分:2)
infile.read((char*)&temp, sizeof(temp));
这将使用文件中的垃圾填充temp
对象。它应该包含有效的std::string
对象以及文件中的任何对象,它不可能是有效的std::string
对象。如果你不明白为什么,请考虑创建一个有效的std::string
对象需要分配内存来保存字符串数据 - 这就是std::string
构造函数的作用。从文件中读取数据不可能这样做。
文件是字节流。要将数据写入文件,您需要定义某种方式将该数据表示为字节流。如果长度可变,则需要对其长度进行编码。要重读它,您还需要处理可变长度的情况。您需要将文件数据转换为适当的内部表示,例如std::string
。这称为“序列化”。
答案 1 :(得分:1)
std :: string size是可变的,你可以尝试以下定义
char item_code[20];
char item_name[20];
char unit_name[20];