繁体   English   中英

如何在C ++中通过二进制模式将列表容器写入文件

[英]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需要执行的操作。 一旦弄清楚了,就很容易使用列表。

  1. 写出列表中的项目数。
  2. 遍历列表并写入列表中的每个项目。

读回它们很简单。

  1. 阅读项目数。
  2. 一次阅读一项并将其添加到列表中。

从二进制文件写入和读取的另一方面是可移植性问题。

您是否需要与其他用户共享二进制文件? 如果是这样,它们是否在同一平台上?

您是否希望这些文件在短期内(例如学期)或长期(公司年限)有用?

这些问题的答案将决定您如何写入二进制数据以及将其读回。

对这些问题的答案将决定如何实现不仅是一种书写和阅读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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM