출력 스트림으로 생성 된 이진 출력 파일의 내용
-
22-08-2019 - |
문제
이 코드는 컴파일하고 실행됩니다. 단순히 내용을 이진 형식으로 인쇄합니다. 그러나 출력은 내가 예상 한 것과 다릅니다.
- 출력 파일 크기는 std :: cout로 만든 것보다 훨씬 작아야합니다.
- 출력 파일의 내용은 압축되어야하므로 편집기에서 열 때 컨텐츠를 볼 수 없어야합니다.
그러나 아래 코드가 왜 그렇게하지 않는가? 그에 따라 어떻게 수정할 수 있습니까?
#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의 경우 연산자를 사용할 수 있습니다 <<)
제휴하지 않습니다 StackOverflow