[英]How to write a list container into a file by binary mode in c++
我在一个模块中遇到问题,该模块需要将用户定义的类'Product'的列表保存到二进制文件中,反之亦然。 我有以下代码:Product'是创建列表的用户定义的类。
class Product
{
private:
long int Product_no;
std::string Product_name;
double Product_price;
int Product_qty;
double Product_tax;
double Product_dis;
public:
//Constructor
Product();
Product(long int, string, double, int, double, double);
Product(long int, double, int, double, double);
//All Getter methods
//All Setter methods
};
并将列表创建为:
list<Product> product_list;
并按以下方式打开要写入的文件:
ofstream out("products.dat", ios::out | ios::binary);
我尝试了以下操作:1.使用write函数
output.write((char*)&product_list.begin(),sizeof(Product));
并已阅读以下内容:
2.首先转换为某种结构,如果不这样做,我将无法从文件中正确获取数据以再次创建产品列表。
哪种方法可以实现所需的存储和检索功能? 我正在考虑从二进制文件读取的代码如下:
Product &p;
while(in.read((char*)&p,sizeof(Product)))
{
p->Display_Product();
Productlist.push_back(p);
}
那是阅读细节的正确方法吗?
最关键的部分是弄清楚将Product
写入文件并从文件中读取Product
需要执行的操作。 一旦弄清楚了,就很容易使用列表。
读回它们很简单。
从二进制文件写入和读取的另一方面是可移植性问题。
您是否需要与其他用户共享二进制文件? 如果是这样,它们是否在同一平台上?
您是否希望这些文件在短期内(例如学期)或长期(公司年限)有用?
这些问题的答案将决定您如何写入二进制数据以及将其读回。
对这些问题的答案将决定如何实现不仅是一种书写和阅读Product
,而且该列表的大小。
您的用法有一些错误:
copy(Product_list.begin(), Product_list.end(), std::ostream_iterator<Product>(output, " "));
在这种用法中,首先您需要为类Product
重写cout operator
,其次,您只能将对象写入text
模式,而不是binary
。
output.write((char*)&product_list.begin(), product_list.size()*sizeof(Product));
这种方式也不正确,请阅读: http : //www.eecs.umich.edu/courses/eecs380/HANDOUTS/cppBinaryFileIO-2.html
正确的方法是:
ifstream infile;
infile.open("hello.dat", ios::binary | ios::out);
for(auto iter = Product_list.begin(); iter!=Product_list.end(); iter++)
{
Product_list& product = *iter;
infile.write(static_cast<const char*>(&product), sizeof(product));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.