문제

이 코드는 컴파일하고 실행됩니다. 단순히 내용을 이진 형식으로 인쇄합니다. 그러나 출력은 내가 예상 한 것과 다릅니다.

  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 longs로 절약해야 할 것입니다.

다른 팁

출력 파일 크기는 std :: cout로 만든 것보다 훨씬 작아야합니다.

"std :: cout로 만들어진"의미는 무엇입니까?
문자열이 아닌 int를 저장하면 조금 더 작을 수 있습니다.

출력 파일의 내용은 압축되어야하므로 편집기에서 열 때 컨텐츠를 볼 수 없어야합니다.

아니요, 압축해서는 안됩니다. boost.iostreams 라이브러리를 사용할 수 있습니다 http://www.boost.org/doc/libs/1_38_0/libs/iostreams/doc/index.html 지퍼 파일을 만들려면.

쉽게 이해하기 위해 바이너리 파일에는 메모리를 보게 될 때 디버거에서 볼 수있는 정보가 포함되어 있다고 생각할 수 있습니다.

또한 이진 형식으로 출력하려면 모든 벡터 항목에 쓰기 스트림 메소드를 사용해야합니다 (경우. std::vector < int > 차이가 있습니다). (출력 t의 경우 연산자를 사용할 수 있습니다 <<)

출력 파일의 내용은 압축되어야하므로 편집기에서 열 때 컨텐츠를 볼 수 없어야합니다.

iostream 라이브러리가 출력에 압축을 적용하지 않을까 두렵습니다. BB가 지적했듯이 다른 라이브러리를 사용하여 스트림을 압축해야합니다.

출력 파일 크기는 std :: cout로 만든 것보다 훨씬 작아야합니다.

이전 인수의 결과로, 바이트 스트림 (ASCII 대표 문자로 발생하는)으로 취급되는 출력은 파일에 "있는대로"쓰여져 있으므로 크기는 변경되지 않습니다.

일부를 살펴보십시오 선적 서류 비치 그리고 a 더 나은 설명 일반적으로 이진 파일의.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top