Je tente un simple test d'E/S de fichier binaire en utilisant l'algorithme de copie STL pour copier des données vers/depuis des conteneurs et un binaire fichier. Voir ci-dessous:E/S de fichiers binaires C++ vers/depuis des conteneurs (autres que char *) en utilisant des algorithmes STL
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 }
La sortie résultante est la suivante et a deux problèmes, 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) Chaque double
lecture à partir des données binaires ne contient pas les informations avant la virgule. 2) Les données sont mutilées à la 3e décimale (ou plus tôt) et une erreur arbitraire est introduite.
S'il vous plaît toute aide serait appréciée. (J'aimerais que quelqu'un me pointe sur un article précédent à ce sujet, car j'ai trouvé ma recherche)
juste curieux - pourquoi un séparateur est-il nécessaire dans la définition d'ostream_iterator? Un octet est-il réellement utilisé à chaque fois que oi est utilisé pour désigner un espace vide? Ne pouvons-nous pas faire sans cet octet supplémentaire et juste lire dans le bon nombre d'octets correspondant à un double et renoncer à un séparateur? – Shamster
En fait, votre fichier n'est pas un fichier binaire est la façon dont vous l'attendez. Ouvrez simplement le fichier temp.bin dans un éditeur de texte. Je ne pense pas que vous pouvez utiliser les manipulateurs de flux comme vous le faites pour stocker les données au format binaire. –
oui, je remarquais qu'ils n'étaient pas stockés en format binaire. Quelle est la manière idiomatique de produire des données binaires à partir d'un conteneur STL en tant que tel? – Shamster