2012-09-22 4 views
0

C++에서 처리중인 재무 데이터가 있습니다. 적은 리소스가 필요하고 빠르기 때문에 간단한 바이너리 형식으로 저장하고 있지만 압축을 파일에 추가하고 싶습니다. 나는 IO 바인딩이 될 것 같아서 압축은 처리 속도면에서별로 비용이 들지 않을 것입니다.압축 파일에 이진 데이터를 쓰는 방법

나는 실제적인 프로그래머가 아니기 때문에 나는 압축을하는 방법을 모른다. 나는이 손을 잡고 약간의 손을 사용할 수 있습니다. 다음과 같이 내가 바이너리 파일에 기록 할 수

I have my data in a structure like this: 

    struct TradesBin { 
    int ttim; 
    int prc; 
    int siz; 
    short int g127; 
    short int corr; 
    char cond[2]; 
    char ex[1]; 
}__attribute__((packed)); 

: tbin이 TradesBin 데이터로 가득

ofstream fout(outfile.c_str(), ios::out | ios::binary); 
fout.write((char *) &tbin, sizeof(TradesBin)); 

.

어떻게 이러한 파일에 압축을 추가 할 수 있습니까? 나는 ZLO, Bzip2, zlib, Boost와 같은 것들을 모호하게 들었다 .IOStreams. 귀하의지도와 제안에 많은 감사를드립니다!

감사합니다.

+0

Zlib는 당신이 사용하기를 원하지만 불행히도 그것을 사용하는 것은 다소 까다 롭습니다. 왜냐하면 그것은 일종의 코 루틴 방식으로 실행되기 때문입니다. 물론 플랫 파일을 작성한 다음 압축하여 압축하는 것이 더 간단합니다. –

+0

Boost에는 zlib 필터 (http://www.boost.org/doc/libs/1_40_0/libs/iostreams/doc/classes/zlib.html)가있어 일반 C++ 스트림 위에 zlib을 사용할 수 있습니다. 그러나 압축이 필요합니까? [조기 최적화] (http://c2.com/cgi/wiki?PrematureOptimization) 및 모두 ... – willglynn

+0

@HotLicks : 코 루틴은 필요하지 않습니다. 방금 최근에 (큰) 양의 간단한 숫자 데이터에 대해 이와 같은 코드를 다루었습니다. 여기서 우리는 double 값을 읽고 쓰고 있습니다. –

답변

2

Zlib에서는이 작업을 수행 할 수 있지만 일반 C 인터페이스 만 제공합니다. 간단히 말해서, 당신은 vecTradesBin 구조 예 A std::vector<TradesBin>이 될 것

gzFile fp = gzopen(fname.c_str(),"wb"); 
gzwrite(fp, (void*) (&vec[0]), sizeof(TradesBin)*nelem); 
gzclose(fp); 

을한다.

+0

답장을 보내 주셔서 감사합니다. 나는 거의 당신의 접근법을 구현할 때 "거기에있다". 그러나, "std :: vector 에서"voidpc "로의 적절한 변환이 없다는 컴파일 오류가 발생합니다. 어떤 제안입니까? – TJB

+0

네, 그렇게해야만합니다. 업데이트 대답 ... 그리고 upvote에 동의하고 받아 들일 수 :) –