Question

Ce code compile et n'exécute. Il suffit d'imprimer le contenu dans un format binaire. Cependant, la sortie est différente de ce que je pensais, à savoir:

  1. Taille du fichier de sortie devrait être beaucoup plus petit que ceux créés avec std :: Cout.
  2. Le contenu du fichier de sortie doit être compressé, donc quand nous ouvrons dans l'éditeur, nous ne devrions pas être en mesure de voir le contenu.

Mais pourquoi le code ci-dessous ne pas faire comme je l'espère qu'il fait? Comment puis-je modifier en conséquence?

#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;

void WriteStr2BinFh(const string& St, ostream &fn)
{
   fn.write(St.c_str(), St.length());
}



int main  ( int arg_count, char *arg_vec[] ) {

    vector <string> Tags;
   // In principle we have millions of such tags
   // Hence we need to compress it into binary output.
    Tags.push_back("0000000000");
    Tags.push_back("0000101110");
    Tags.push_back("0133030122");
    Tags.push_back("0133132033");
    Tags.push_back("1002013320");
    Tags.push_back("1111111111");
    Tags.push_back("1301013133");
    Tags.push_back("3010112111");
    Tags.push_back("3203012113");
    Tags.push_back("3203012212");

    //prn_vec<string>(Tags, "\t");
    //cout << endl;

    ofstream outfile;
    outfile.open("MyOut.bin", ios::binary|ios::out);

    for (unsigned i=0; i <Tags.size(); i++) {
         WriteStr2BinFh(Tags[i]+"\t",outfile);
    }

    outfile.close();

    return 0;
}
Était-ce utile?

La solution

Vous devez écrire des données au format binaire (non texte):

void WriteStr2BinFh(const string& St, ostream &fn)
{
char *p = 0;
long l = strtol(St.c_str(), &p);
fn << l;
}

Vous devez savoir que les types comme temps ont des valeurs maximales, de sorte que vous aurez probablement à diviser votre chaîne en morceaux n et enregistrer en tant que désire ardemment n.

Autres conseils

  

Taille du fichier de sortie devrait être beaucoup   plus petit que ceux créés avec   std :: Cout

Qu'est-ce que vous voulez dire "créé avec std :: Cout"?
Il pourrait être un peu plus petit si vous économiserez ints, pas des chaînes.

  

Le contenu du fichier de sortie doit être   compressé, donc quand nous ouvrons en   rédacteur en chef, nous ne devrions pas être en mesure de voir   le contenu.

Non, il ne doit pas être comprimé. Vous pouvez utiliser la bibliothèque Boost.Iostreams http: // www .boost.org / doc / libs / 1_38_0 / libs / iostreams / doc / index.html pour créer des fichiers compressés.

Pour faciliter la compréhension, vous pouvez penser que fichier binaire contient des informations que vous pouvez voir dans débogueur quand va regarder la mémoire.

En outre pour la sortie en format binnary vous devez utiliser la méthode d'écriture de flux pour tous les éléments vectoriels (en cas std::vector < int > il aura la différence). (Pour la sortie \ t vous pouvez utiliser l'opérateur <<)

  

Le contenu du fichier de sortie doit être compressé, donc quand nous ouvrons dans l'éditeur, nous ne devrions pas être en mesure de voir le contenu.

Je crains que la bibliothèque iostream n'applique aucune compression à votre sortie. Comme bb a souligné, vous devez utiliser une autre bibliothèque pour obtenir votre compressé flux.

  

Taille du fichier de sortie devrait être beaucoup plus petit que ceux créés avec std :: Cout.

En conséquence de l'argument précédent, la sortie, qui est traité comme un flux d'octets (qui se trouvent être des caractères représentés ASCII) est écrite « est » au fichier, et, par conséquent, la taille ne changera pas .

Jetez un oeil à la documentation et meilleure explication des fichiers binaires en général.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top