Содержимое двоичного выходного файла, созданного с помощью выходного потока

StackOverflow https://stackoverflow.com/questions/684931

  •  22-08-2019
  •  | 
  •  

Вопрос

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

  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;
}
Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top