I'm attempting a simple test of binary file I/O using the STL copy algorithm to copy data to/from containers and a binary file. See below:
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 }
The resulting output is as follows and has two problems, 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) Every double
read from the binary data is missing the information before the decimal place.
2) The data is mangled at the 3rd decimal place (or earlier) and some arbitrary error is being introduced.
Please any help would be appreciated. (I would love for someone to point me to a previous post about this, as I've come up short in my search)