2009-09-19 3 views
12

나는 메모리 블록 (불투명)을 가지고 있는데, 이는 C++ 어댑터를 통해 mySQL에 Blob에 저장하려고한다. 어댑터는 IStream을 기대 :메모리 버퍼에서 C++ std :: istringstream을 초기화 하시겠습니까?

virtual void setBlob(unsigned int parameterIndex, std::istream * blob) = 0; 

그래서 내 질문 :이 메모리 블록에서 표준 :: istream로를 만드는 방법 (숯불 *로 입력). null로 종료되지 않기 때문에 문자열이 아닙니다 (그러나 길이는 알고 있습니다).

예를 들어 std :: string과 같은 메모리 블록을 복사하지 않고도이를 수행 할 방법을 찾지 못했습니다. 나는 이것이 약간 낭비라고 생각한다. 이런 식으로 뭔가가 작동하지 않습니다

std::streambuf istringbuf(blockPtr, blockLength); 
    std::istringstream tmp_blob(&istringbuf); 

표준 : streambuf의 나던 때문에 이러한 생성자가 있습니다. 나는 다음과 같은 제안을 보았다.

std:: istringstream  tmp_blob; 
    tmp_blob.rdbuf()->pubsetbuf(blockPtr, blockLength); 

올바른 방법입니까? 표준에서

+0

가능한 복제 http://stackoverflow.com/questions/1494182/setting-the-internal-buffer- Use-by-a-standard-stream-pubsetbuf) –

답변

7

봐는 ::이이 클래스는 종류의 감가 상각 생성자

istrstream(char* pch, int nLength); 

을 가지고 또는 적어도 당신이 일반적으로 다른 클래스를 사용하는 말된다 istrstream.
strstream의 문제는 char * 버퍼의 메모리를 관리하는 것이 더 복잡하기 때문에 일반적으로 메모리 관리처럼 stringstream을 선호합니다. 그러나이 경우 char *의 메모리를 이미 관리하고 있으므로 정상적인 이점은 비용입니다. 실제로이 경우 strstream은 코드 나 속도에서 최소한의 오버 헤드로 원하는 것을 정확히 수행합니다. ostrsteram by Herb Sutter

+5

Josuttis는 "char * 스트림 클래스는 이전 버전과의 호환성을 위해서만 유지되며 인터페이스는 오류가 발생하기 쉽고 올바르게 사용되지 않습니다." 이것이 내가 그들을 사용하기를 꺼려하는 이유입니다. 그리고 "이전 버전과의 호환성을 위해서만 유지"는 "더 나은"클래스를 사용하는 더 좋은 방법이 있음을 암시하는 것으로 보입니다. –

+0

나는 그 기사를 읽었으며, 직접 관련성이있다. 감사. 내 질문에, 비록 "tmp_blob에 대한 의견은 대답하지만 같아요. –

6

Boost.IOStreams에는 stringstream처럼 작동하지만 네이티브 배열을 래핑하는 스트림이 있으므로 데이터를 복사하지 않아도됩니다.

표준 : 이제 stringstream은 항상

std::stringstream ss; 
ss.write(blockPtr, blockLength); 
ss.seekg(0); 

그런 다음 SS와 그의 setBlob 함수를 호출 ... 자신의 내부 버퍼

0

안된 그러나 아마 가치 테스트를 만듭니다. 당신은 여전히 ​​std :: stringstream 내부 버퍼가 이미 언급 한 jalf로있다.

37

std::streambuf의 모든 가상 함수의 기본 동작이 '올바른 것'을 수행하므로 실제로는 버퍼를 사용하는 원샷 std::streambuf을 작성하는 것이 쉽지 않습니다. underflowuflow은 초기화 영역의 끝이 스트림의 끝이므로 traits_type::eof()을 반환하도록 안전하게 남겨 둘 수 있습니다.

예 : ([표준 스트림 (pubsetbuf)가 사용하는 내부 버퍼를 설정]의

#include <streambuf> 
#include <iostream> 
#include <istream> 
#include <ostream> 

struct OneShotReadBuf : public std::streambuf 
{ 
    OneShotReadBuf(char* s, std::size_t n) 
    { 
     setg(s, s, s + n); 
    } 
}; 

char hw[] = "Hello, World!\n"; 

int main() 
{ 
    // In this case disregard the null terminator 
    OneShotReadBuf osrb(hw, sizeof hw - 1); 
    std::istream istr(&osrb); 

    istr >> std::cout.rdbuf(); 
} 
+0

질문을 올렸을 때 솔루션이 검색 결과에 표시되지 않았습니다.) http : // stackoverflow .com/questions/2079912/더 간단한 방법으로 만들기 -ac-memorystream-from-char-sizet-without-copying-th –

관련 문제