Содержимое двоичного выходного файла, созданного с выходным потоком - PullRequest
0 голосов
/ 26 марта 2009

Этот код компилируется и выполняется. Это просто распечатать содержание в двоичном формате. Однако результат отличается от того, что я ожидал, а именно:

  1. Размер выходного файла должен быть намного меньше размера файла, созданного с помощью std :: cout.
  2. Содержимое выходного файла должно быть сжато, поэтому, когда мы открываем его в редакторе, мы не должны видеть содержимое.

Но почему приведенный ниже код не работает так, как я надеюсь? Как я могу изменить его соответственно?

#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;
}

Ответы [ 3 ]

3 голосов
/ 26 марта 2009

Размер выходного файла должен быть много меньше, чем те, которые созданы с станд :: соиЬ

Что вы имеете в виду "создано с помощью std :: cout"?
Это может быть немного меньше, если вы сохраните целые, а не строки.

Содержимое выходного файла должно быть сжатый, следовательно, когда мы открываем его в редактор, мы не должны видеть содержание.

Нет, оно не должно быть сжато. Вы можете использовать библиотеку Boost.Iostreams http://www.boost.org/doc/libs/1_38_0/libs/iostreams/doc/index.html для создания сжатых файлов.

Для простоты понимания вы можете подумать, что двоичный файл содержит информацию, которую вы можете видеть в отладчике, когда будет искать память.

Также для вывода в двоичном формате вы должны использовать метод потока записи для всех векторных элементов (в случае с std::vector < int > это будет иметь различие). (для вывода \ t вы можете использовать оператор <<) </p>

1 голос
/ 26 марта 2009

Содержимое выходного файла должно быть сжато, поэтому, когда мы открываем его в редакторе, мы не можем видеть содержимое.

Боюсь, что библиотека IOStream не применяет никакого сжатия к вашему выводу. Как указал bb, вам следует использовать другую библиотеку для сжатия потока.

Размер выходного файла должен быть намного меньше размера файла, созданного с помощью std :: cout.

Как следствие предыдущего аргумента, вывод, который обрабатывается как поток байтов (которые представляют собой символы, представленные в ASCII), записывается в файл «как есть», и, следовательно, размер не изменится .

Взгляните на некоторую документацию и лучшее объяснение бинарных файлов в целом.

1 голос
/ 26 марта 2009

Вы должны записать данные в двоичном формате (не текстовом):

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

Вы должны знать, что типы типа long имеют некоторые максимальные значения, поэтому вам, вероятно, придется разбить вашу строку на n частей и сохранить как n long.

...