Domanda

Questo codice compila e fa eseguire. E 'semplicemente stampare il contenuto in un formato binario. Tuttavia l'uscita differisce da quello che mi aspettavo, e cioè:

  1. le dimensioni del file di output dovrebbe essere molto più piccoli che quelli creati con std :: cout.
  2. Il contenuto del file di output deve essere compresso, quindi quando abbiamo aperto in Editor, non dovremmo essere in grado di vedere il contenuto.

Ma perché il codice qui sotto non fare come spero lo fa? Come posso modificare di conseguenza?

#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;
}
È stato utile?

Soluzione

È necessario scrivere i dati in formato binario (non il testo):

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

È necessario essere consapevoli del fatto che i tipi come a lungo hanno alcuni valori massimi, quindi probabilmente si dovrà dividere la stringa in n pezzi e salvare come n anela.

Altri suggerimenti

  

dimensione del file di output dovrebbe essere molto più   più piccola che quelli creati con   std :: cout

Cosa vuoi dire "creati con std :: cout"?
Potrebbe essere un po 'più piccola, se si farà risparmiare interi, non stringhe.

  

Il contenuto del file di output dovrebbe essere   compresso, quindi quando si apre in   Editor, non dovremmo essere in grado di vedere   il contenuto.

No, non dovrebbe essere compresso. Si potrebbe utilizzare Boost.Iostreams biblioteca http: // www .boost.org / doc / librerie / 1_38_0 / librerie / iostreams / doc / index.html per creare file compressi.

Per facilitare la comprensione si potrebbe pensare che file binario contengono informazioni che si poteva vedere in debugger, quando si cerca di memoria.

Anche per l'output in formato binnary si dovrebbe utilizzare il metodo di scrittura flusso per tutti gli elementi vettoriali (nel caso in cui con std::vector < int > avrà differenza). (Per l'uscita \ t si potrebbe usare operatore <<)

  

Il contenuto del file di output deve essere compresso, quindi quando apriamo in editore, non dovremmo essere in grado di vedere il contenuto.

Ho paura che la libreria iostream non si applica alcuna compressione per l'output. Come bb ha sottolineato, è necessario utilizzare un'altra libreria per ottenere il vostro flusso compresso.

  

dimensione del file di output dovrebbe essere molto più piccoli che quelli creati con std :: cout.

In conseguenza dell'argomento precedente, l'uscita, che viene trattata come un flusso di byte (che si trovano ad essere ASCII rappresentato caratteri) è scritto "come è" al file, e, di conseguenza, la dimensione non cambierà .

Date un'occhiata a qualche documentazione e un spiegazione migliore di file binari in generale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top