Pergunta

compila este código e é executado. Ele simplesmente imprimir o conteúdo em um formato binário. No entanto, os difere de saída do que eu esperava, a saber:

  1. tamanho do arquivo de saída deve ser muito menor que aqueles criados com std :: cout.
  2. O conteúdo do arquivo de saída deve ser comprimida, portanto, quando abri-lo no editor, não deve ser capaz de ver o conteúdo.

Mas por que o código abaixo não faça o que eu espero que ele faz? Como posso modificá-lo de acordo?

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

Solução

Você deve escrever dados em formato binário (não texto):

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

Você deve estar ciente de que tipos como o longa tem alguns valores máximos, então você provavelmente terá que dividir o seu string em n peças e salvar como n anseia.

Outras dicas

tamanho do arquivo de saída deve ser muito menor que aqueles criados com std :: cout

O que você quer dizer "criado com std :: cout"?
Poderia ser um pouco menor se você vai economizar ints, não strings.

O conteúdo do arquivo de saída deve ser comprimida, portanto, quando abri-lo no editor, que não deve ser capaz de ver o conteúdo.

Não, ele não deve ser comprimido. Você poderia usar a biblioteca Boost.Iostreams http: // www .boost.org / doc / libs / 1_38_0 / libs / iostreams / doc / index.html para criar arquivos compactados.

Para facilitar a compreensão que você poderia pensar que arquivo binário contêm informações que você pode ver no depurador quando vai à procura de memória.

Também para saída em formato binnary você deve usar o método de fluxo de gravação para todos os itens do vetor (no caso com std::vector < int > terá diferença). (Para a saída \ t você poderia usar o operador <<)

O conteúdo do arquivo de saída deve ser comprimida, portanto, quando abri-lo no editor, que não deve ser capaz de ver o conteúdo.

Eu tenho medo que a Biblioteca iostream não se aplica qualquer compressão para sua saída. Como bb apontou, você deve usar outra biblioteca para obter seu fluxo comprimido.

tamanho do arquivo de saída deve ser muito menor que aqueles criados com std :: cout.

Como consequência do argumento anterior, a saída, que é tratado como um fluxo de bytes (que por acaso são ASCII representado caracteres) está escrito "como está" para o arquivo, e, portanto, o tamanho não vai mudar .

Dê uma olhada em algumas documentação e uma melhor explicação de arquivos binários em geral.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top