我在模块中遇到问题,需要将用户定义的类'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);
}
这是阅读细节的正确方法吗?
答案 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>
写入文件并从文件中读取文件。一旦你弄明白了,就可以很容易地使用列表了。
回读它们就是这么简单。
从二进制文件写入和读取的另一个方面是可移植性问题。
您是否需要与其他用户共享二进制文件?如果是这样,他们是否在同一平台上?
您是否希望这些文件在短期内(如学期)或长期(公司年份)有用?
这些答案将决定您如何编写二进制数据并将其读回。
这些问题的答案将决定如何实现不仅Product
的写作和阅读,而且还包括列表的大小。
答案 1 :(得分:1)
你的uasage有一些错误:
copy(Product_list.begin(), Product_list.end(), std::ostream_iterator<Product>(output, " "));
在此用法中,首先需要覆盖cout operator
类Product
,其次,您只能将对象写入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));
}