Frage

Dieser Code kompiliert und ausführt. Es druckt einfach den Inhalt in ein binäres Format. Doch die Ausgabe unterscheidet sich von dem, was ich erwartet hatte, nämlich:

  1. Ausgabedateigröße sollte mit std :: cout erstellt, dass diese viel kleiner sein.
  2. Der Inhalt der Ausgabedatei komprimiert werden soll, also wenn wir öffnen Sie es in Editor, wir sollten sehen können den Inhalt nicht.

Aber warum der folgende Code nicht tut, wie ich es tut hoffen? Wie kann ich es entsprechend ändern?

#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;
}
War es hilfreich?

Lösung

Sie müssen die Daten im Binärformat schreiben (nicht Text):

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

Sie müssen sich bewusst sein, dass Typen wie lange einige Maximalwerte haben, so dass Sie wahrscheinlich und wie n longs speichern müssen Ihre Zeichenfolge in n Stücke aufzuteilen.

Andere Tipps

  

Größe der Ausgabedatei sollte viel sein   dass diejenigen kleiner erstellt mit   std :: cout

Was Sie bedeuten "erstellt mit std :: cout"?
Es könnte ein wenig kleiner sein, wenn Sie Ints sparen, keine Strings.

  

Für den Inhalt der Ausgabedatei sollte   komprimiert, also wenn wir öffnen es in   Editor, sollten wir nicht in der Lage sein zu sehen,   der Inhalt.

Nein, es nicht komprimiert werden soll. Sie könnten Boost.Iostreams Bibliothek http: // www .boost.org / doc / libs / 1_38_0 / libs / iostreams / doc / index.html für ZIP-Dateien erstellen.

Zum leichteren Verständnis könnte man denken, dass binäre Datei Informationen enthält, die Sie in Debugger sehen konnten, wenn der Speicher suchen, wird.

Auch für die in binnary Format ausgeben Sie Write-Stream-Verfahren für alle Vektor-Objekte (im Fall mit std::vector < int > es Scheidet) verwenden sollte. (Für die Ausgabe \ t Sie könnten Operator <<)

  

Für den Inhalt der Ausgabedatei komprimiert werden soll, also, wenn wir es in Editor zu öffnen, sollten wir sehen können den Inhalt nicht.

Ich habe Angst, dass die iostream-Bibliothek keine Kompression auf die Ausgabe anwenden. Wie bb wies darauf hin, sollten Sie eine andere Bibliothek verwenden, um Ihren Stream zu erhalten komprimiert.

  

Größe der Ausgabedatei soll, dass diejenigen mit std :: cout erstellt viel kleiner sein.

Als Folge des vorherigen Argument, die Ausgabe, die als Byte-Strom behandelt wird (die ASCII sein passieren Zeichen dargestellt) wird in die Datei geschrieben „wie sie ist“, und daher wird die Größe nicht ändern .

Werfen Sie einen Blick auf einige Dokumentation und bessere Erklärung von Binärdateien im allgemeinen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top