2012-05-10 6 views
0

나는 filtering_streams를 사용하여 어떤 객체의 직렬화를 array_sink 또는 유사 장치로 압축하려고합니다. 그런 다음 압축 된 출력의 길이를 결정하고 다른 스트림 (예 : 파일)에 복사 할 수 있습니다. 그러나 filtering_ostreamostream::tellp을 사용하면 부스트가 런타임 예외를 발생시킵니다. 나는 내가 뭘 잘못하고 있는지 알 수 없다.부스트 filtering_stream 및 tellp

using namespace boost::iostreams; 

char *buffer = new char[4096*255]; 
array_sink zipStream(buffer, 4096*255); 

filtering_ostream tempOut; 
tempOut.push(zlib_compressor()); 
tempOut.push(zipStream); 

column->Serialize(tempOut); // Object::Serialize(ostream&) 
tempOut.flush(); // ? 
int zipSize = tempOut.tellp(); 

// Do stuff with zipStream... 

답변

1

문제는 tellp가 기본 스트림 버퍼 현재의 기록 헤드 위치로부터 오프셋 0 pubseekoff 환산으로 구현된다는 점이다 (기본적으로, 단지 불량한 디자인이다). 자, 여기서 키커는 zlib_compressoroutput_seekable 싱크와 작동하지 않는다는 것입니다 (문서에서 볼 수있는 것처럼). 쓰기 헤드를 변경하면 거의 확실하게 손상된 데이터가 생성되므로 이는 매우 자연스러운 일입니다. 압축 풀기를 시도하면 똑같은 문제가 발생합니다.

+0

고마워요! 나는이 생각의 라인을 따라 작업하고 있었지만, 탐색 할 수없는 것이 tellp을 막을 수는 없다는 것을 알지 못했지만 - 스택을 통해 달리다 보니 실제로 시도하고있는 것을 보았습니다. 예외를 던지고있는 것을 보았습니다. 나는 스트림에'카운터 (counter) '필터를 넣어 원하는 것을 얻었습니다. – MischaNix