, (리눅스, Glibc의), 당신은 당신의 디코딩 작업에 대한 FILE *
래퍼를 만들 fopencookie
를 사용할 수 있습니다
FILE *fopencookie(void *cookie, const char *mode, cookie_io_functions_t io_funcs);
[...]
fopencookie() 함수는 fopen (3)과 비슷한 용도로 사용됩니다. 은 새 스트림을 열고 해당 스트림에서 작동하는 데 사용되는 인 FILE 개체에 대한 포인터를 반환합니다.
쿠키 인수는 새 스트림과 연결될 호출자의 쿠키 구조 에 대한 포인터입니다. 이 포인터는 표준 I/O 라이브러리가 을 호출 할 때 첫 번째 인수로 제공되는 입니다.
mode 인수는 fopen (3)과 같은 용도로 사용됩니다. 다음 모드가 지원됩니다 (r, w, a, r +, w + 및 a +). 자세한 내용은 fopen (3) 을 참조하십시오.
io_funcs 인수는이 스트림을 구현하는 에 사용되는 프로그래머 정의 후크 함수를 가리키는 네 개의 필드 을 포함하는 구조입니다.
(I 내 대답에 전체 맨 페이지를 복사하지 않았다)
typedef struct {
cookie_read_function_t *read;
cookie_write_function_t *write;
cookie_seek_function_t *seek;
cookie_close_function_t *close;
} cookie_io_functions_t;
을 [...] 다음과 같이 구조가 정의된다.
은 기본적으로 다음을 수행 할 수 있습니다 : 그것은 정확히 같은 일을 달성하기 위해 약간 다른 API 단지 인
funopen
함께 제공하기 때문에 BSD에
ssize_t my_read(void *cookie, char *buf, size_t size) {
std::istream *the_stream = static_cast<std::istream*>(cookie);
// insert magic
return bytes_read;
}
cookie_io_functions_t my_functions = {
my_read,
NULL,
NULL,
NULL,
};
...
FILE *wrapped = fopencookie(static_cast<void *>&stream, "rb", my_functions);
은/OSX, 당신은, 동등하게 운이 좋은 것입니다.
그리고 Windows를 지원하고 싶다면, poor you.
'open_memstream'을보세요. 원하는대로 할 수 있습니다. –
스트리밍/버퍼 된 데이터를 원한다면'pipe'와'fdopen'이'fmemopen'보다 낫습니다. – Sneftel
[boost :: zlib] (http://www.boost.org/doc/libs/release/libs/iostreams/doc/classes/zlib.html)가 도움이됩니까? – jxh