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

时间:2016-06-14 19:26:49

标签: c++ list stl binaryfiles

我在模块中遇到问题,需要将用户定义的类'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.使用写入功能

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);
    }

这是阅读细节的正确方法吗?

2 个答案:

答案 0 :(得分:1)

最关键的部分是弄清楚如何将<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <title></title> <head> <style type="text/css"> /*BACKGROUND IMAGE*/ body { margin: 0; background-image: url("background5.png"); background-size: cover; background-repeat: no-repeat; background-attachment: fixed; background-position: center; padding: 1px; } div#banner { width: 100%; height: 100%; } .nav-bar { list-style: none; margin: 0 auto; padding: 1px; width: 525px; } ul#nav-bar li { display: inline-block; } ul#nav-bar li a { text-decoration: underline; padding: 10px 0; width: 200px; margin: 0 1%; background: #25aee4; color: black; float: left; text-align: center; border-left: 2px solid black; border-radius: 5px; } div#sidebar { border: 20px; } </style> </head> <body> <div id="banner"> <center> <img src="owiFull.png" width="1150" height="170" alt="banner" border="1px"> </center> </div> <div class="navigation"> <center> <ul id="nav-bar"> <li> <a href="index.html">Home</a> </li> <li> <a href="about.html">About Us</a> </li> <li> <a href="about.html">Current Projects</a> </li> <li> <a href="about.html">Contact</a> </li> </ul> </center> </div> <div id= "sideBar"> <img src="pixelSideBar.png" border="1px"> </div> </body> </html> 写入文件并从文件中读取文件。一旦你弄明白了,就可以很容易地使用列表了。

  1. 写下列表中的项目数。
  2. 遍历列表并从列表中写下每个项目。
  3. 回读它们就是这么简单。

    1. 阅读物品数量。
    2. 一次阅读一个项目并将其添加到列表中。
    3. 从二进制文件写入和读取的另一个方面是可移植性问题。

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

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

      这些答案将决定您如何编写二进制数据并将其读回。

      这些问题的答案将决定如何实现不仅Product的写作和阅读,而且还包括列表的大小。

答案 1 :(得分:1)

你的uasage有一些错误:

copy(Product_list.begin(), Product_list.end(), std::ostream_iterator<Product>(output, "  "));

在此用法中,首先需要覆盖cout operatorProduct,其次,您只能将对象写入text模式,而不是binary。< / p>

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));
}