Pregunta

Este código se compila y se ejecuta de forma. Simplemente imprime el contenido en un formato binario. Sin embargo la salida difiere de lo que esperaba, a saber:

  1. Tamaño de archivo de salida debe ser mucho más pequeños que los creados con std :: cout.
  2. El contenido del archivo de salida se debe comprimir, por lo tanto, cuando abrimos en el editor, no hay que ser capaz de ver el contenido.

Pero, ¿por debajo del código de no hacer lo que espero que así sea? ¿Cómo puedo modificar en consecuencia?

#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;
}
¿Fue útil?

Solución

Debe escribir datos en formato binario (no de texto):

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

Usted debe ser consciente de que los tipos a largo como tienen algunos valores máximos, por lo que probablemente tendrá que dividir su cadena en n piezas y guardar como n anhela.

Otros consejos

  

Tamaño de archivo de salida debe ser mucho   más pequeña que los creados con   std :: cout

Lo que quiere decir "creado con std :: cout"?
Podría ser un poco más pequeño si se ahorrará enteros, no cadenas.

  

El contenido del archivo de salida debe ser   comprimido, por lo tanto, cuando abrimos en   editor, que no debería ser capaz de ver   el contenido.

No, no se debe comprimir. Se podría utilizar la biblioteca Boost.Iostreams http: // www .boost.org / doc / libs / 1_38_0 / libs / iostreams / doc / index.html para crear archivos comprimidos.

Para facilitar la explicación se podría pensar que el archivo binario contiene información de la que se podía ver en el depurador cuando se busca la memoria.

También para dar salida en formato binnary usted debe utilizar el método de flujo de escritura para todos los elementos del vector (en caso de std::vector < int > tendrá diferencia). (Para la salida \ t se puede utilizar el operador <<)

  

El contenido del archivo de salida se debe comprimir, por lo tanto, cuando abrimos en el editor, no debemos ser capaces de ver el contenido.

Me temo que la biblioteca iostream no se aplica ningún tipo de compresión para su salida. Como bb señaló, se debe utilizar otra biblioteca para obtener su flujo comprimido.

  

Tamaño de archivo de salida debe ser mucho más pequeños que los creados con std :: cout.

Como consecuencia de la discusión anterior, la salida, que es tratado como un flujo de bytes (que resultan ser ASCII representada caracteres) se escribe "tal cual" en el fichero, y, por lo tanto, el tamaño no cambiará .

Tome un vistazo a algunos documentación y una mejor explicación de archivos binarios en general.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top