bonjour,
Je travail sur un projet où j'ai besoin de sérialiser en binaire un objet (Contig).
Cet objet contient :
string name, string basecalls, string quality et un vector <pair <string,string> >.
L'idée de mon main est de parser un fichier, puis je prend les infos de ce fichier j'en crée mes objets Contig, toujours dans le main, j'ai un vecteur de Contig que je souhaite donc sérialiser. Pour ceci j'ai mon operator<< que voici :
Dans mon main, je fais appel a celui ci, comme ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 //Contig.cpp ostream& operator<< (ostream& stream, Contig const &obj) { size_t nameSize (obj.name.length()), basecallsSize(obj.basecalls.length()), qualitySize(obj.quality.length()), vectorSize (obj.v_DirPos.size()), srcSize, clrSize; //name, basecalls and quality stream.write ((char*)&nameSize, sizeof(int)); stream.write (obj.name.c_str(), nameSize); stream.write ((char*)&basecallsSize, sizeof(int)); stream.write (obj.basecalls.c_str(), basecallsSize); stream.write ((char*)&qualitySize, sizeof(int)); stream.write (obj.quality.c_str(), qualitySize); //vector stream.write ((char*)&vectorSize, sizeof(vectorSize)); for (int i=0; i<(signed)obj.v_DirPos.size(); i++) { srcSize=obj.v_DirPos[i].first.length(); stream.write ((char*)&srcSize, sizeof(srcSize)); stream.write (obj.v_DirPos[i].first.c_str(), srcSize); clrSize=obj.v_DirPos[i].second.length(); stream.write ((char*)&clrSize, sizeof(clrSize)); stream.write (obj.v_DirPos[i].second.c_str(), clrSize); } return stream; }
Voila, donc il doit sans doute y avoir des manière plus propre de coder ce que j'ai fait...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 //main.cpp int main(void) { try { vector<Contig> contigVector; Contig c1; Parser p; filebuf fb; char * file = "res/velvet_asm.afg"; fb.open (file, ios::in); istream is (&fb); p.parseFile (is); contigVector = p.vectorToContig (p.getVector()); ofstream ofs("res/output",ofstream::binary); ostream_iterator<Contig> osi (ofs); copy(contigVector.begin(), contigVector.end(), osi); //etc...
Sinon mon problème est que mon fichier de sortie n'est pas en binaire, il est bel et bien écrit en ascii et lisible par un humain^^. C'est donc la mon problème et je ne vois pas vraiment ce qui ne va pas dans mon code...
si besoin de plus de précision, pas de souci.
Merci d'avance.
Partager