2010-03-19 25 views
3

je dois écrire un tas d'entiers non signés std::ofstream en mode binaire:Ecrire ensemble des entiers à std :: ofstream et pouvoir les relire

std::ofstream f; 
f.open("some path", std::ios::out | std::ios::binary); 
// some loop 
{ 
    unsigned int k = get_k(); // may product numbers from 0 to 65535 
    f << k; 
} 
f.close(); 

Ils sont écrits dans le fichier de sortie « comme est "sans aucun délimiteur. Donc, quand j'essaie de les relire (s'attendant à obtenir ce que j'ai écrit) en utilisant std::ifstream je reçois des valeurs très étranges. Qu'est-ce que je fais mal?

Ou je devrais mettre ' ' (espace) au flux après n'importe quel nombre ajouté pour les séparer?

Merci.

+5

Pensez-vous que ios :: binary rendra vos flux de sortie entiers comme binaires, au lieu de ASCII? (J'avais l'habitude d'avoir cette idée fausse moi-même.) –

Répondre

3

operator<< produit du texte formaté comme sa sortie, donc oui, vous devrez mettre une sorte d'espace entre les nombres pour les séparer. Dans le cas contraire, ils fonctionneront tous ensemble en une seule chaîne de chiffres, et quand vous les lirez de nouveau, ils continueront à lire les chiffres en tant que partie d'un nombre jusqu'à ce qu'il déborde - par ex. Si vous avez écrit 1 trois fois, il sera lu comme 111.

4

Vous utilisez operator<<() qui affiche le texte formaté dans un flux. Vous écrivez donc du texte en clair dans un fichier binaire, ce qui annule le but de l'écriture en mode binaire. Essayez d'ouvrir le fichier de sortie dans un éditeur de texte et voyez par vous-même. Vous avez deux choix: soit écrire en mode texte et délimiter vos valeurs avec des espaces (parce que l'écriture en mode binaire est trompeur lorsque vous utilisez une sortie formatée), ou utiliser la méthode write() du flux avec le cast.

f.write(reinterpret_cast<char*>(&k), sizeof(int)); 
// ... 
f.read(reinterpret_cast<char*>(&k), sizeof(int)); 

Personnellement, je préfère écrire en mode texte. Cela signifie avoir un code plus propre et un fichier de sortie portable. Si vous devez vous pouvez compresser le fichier.