title: C++ binary file I/O to/from containers (other than char *) using STL algorithms
body: <p>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:</p>
  
  <pre><code> 1 #include &lt;iostream&gt;
   2 #include &lt;iterator&gt;
   3 #include &lt;fstream&gt;
   4 #include &lt;vector&gt;
   5 #include &lt;algorithm&gt;
   6 
   7 using namespace std;
   8
   9 typedef std::ostream_iterator&lt;double&gt; oi_t;
  10 typedef std::istream_iterator&lt;double&gt; ii_t;
  11 
  12 int main () {
  13
  14   // generate some data to test
  15   std::vector&lt;double&gt; vd;
  16   for (int i = 0; i &lt; 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&lt;double&gt; 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 &lt; 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 }
  </code></pre>
  
  <p>The resulting output is as follows and has two problems, afaik:</p>
  
  <pre><code>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
  </code></pre>
  
  <p>1) Every <code>double</code> 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.</p>
  
  <p>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)</p>