【发布时间】:2010-12-23 18:21:38
【问题描述】:
我正在尝试使用 STL 复制算法对二进制文件 I/O 进行简单测试,以将数据复制到容器和二进制文件中。见下文:
1 #include <iostream>
2 #include <iterator>
3 #include <fstream>
4 #include <vector>
5 #include <algorithm>
6
7 using namespace std;
8
9 typedef std::ostream_iterator<double> oi_t;
10 typedef std::istream_iterator<double> ii_t;
11
12 int main () {
13
14 // generate some data to test
15 std::vector<double> vd;
16 for (int i = 0; i < 20; i++)
17 {
18 double d = rand() / 1000000.0;
19 vd.push_back(d);
20 }
21
22 // perform output to a binary file
23 ofstream output ("temp.bin", ios::binary);
24 copy (vd.begin(), vd.end(), oi_t(output, (char *)NULL));
25 output.close();
26
27 // input from the binary file to a container
28 std::vector<double> vi;
29 ifstream input ("temp.bin", ios::binary);
30 ii_t ii(input);
31 copy (ii, ii_t(), back_inserter(vi));
32 input.close();
33
34 // output data to screen to verify/compare the results
35 for (int i = 0; i < vd.size(); i++)
36 printf ("%8.4f %8.4f\n", vd[i], vi[i]);
37
38 printf ("vd.size() = %d\tvi.size() = %d\n", vd.size(), vi.size());
39 return 0;
40 }
结果输出如下,有两个问题,afaik:
1804.2894 1804.2985
846.9309 0.9312
1681.6928 0.6917
1714.6369 0.6420
1957.7478 0.7542
424.2383 0.2387
719.8854 0.8852
1649.7605 0.7660
596.5166 0.5171
1189.6414 0.6410
1025.2024 0.2135
1350.4900 0.4978
783.3687 0.3691
1102.5201 0.5220
2044.8978 0.9197
1967.5139 0.5114
1365.1805 0.1815
1540.3834 0.3830
304.0892 0.0891
1303.4557 0.4600
vd.size() = 20 vi.size() = 20
1) 从二进制数据中读取的每个double 都缺少小数位前的信息。
2) 数据在小数点后第 3 位(或更早)被破坏,并且引入了一些任意错误。
如有任何帮助,我们将不胜感激。 (我希望有人能指点我之前关于此的帖子,因为我在搜索中遇到了不足)
【问题讨论】:
标签: c++ stl binary iterator io