문제

C ++ 어댑터를 통해 MySQL의 블로브에 보관하고 싶은 메모리 블록 (Opaque)이 있습니다. 어댑터는 istream을 기대합니다.

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

따라서 내 질문은 다음과 같습니다.이 메모리 블록 (char*로 입력)에서 std :: istream을 어떻게 만들 수 있습니까? 무효가되지 않기 때문에 문자열이 아닙니다 (그러나 나는 그 길이를 알고 있습니다).

예를 들어 STD :: 문자열에서 메모리 블록을 복사하지 않고는 할 수있는 방법을 찾을 수 없었습니다. 나는 이것이 약간 낭비라고 생각합니다. 이와 같은 것이 작동하지 않습니다.

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

std :: streamBuf에는 그러한 생성자가 없기 때문입니다. 나는 다음 제안을 보았다.

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

그게 올바른 방법인가요?

도움이 되었습니까?

해결책

std :: istrstream은 생성자가 있습니다

 istrstream( char* pch, int nLength );

이 수업은 일종의 감가 상각이거나 적어도 일반적으로 다른 클래스를 사용하라는 지시를받습니다.
strstream의 문제는 Char* 버퍼의 메모리를 관리하는 것이 더 복잡하다는 것입니다. 일반적으로 메모리 관리를 수행 할 때 Stringstream을 선호합니다. 그러나이 경우에는 이미 Char*의 메모리를 관리하고 있으므로 정상적인 혜택은 비용입니다. 실제로이 경우 Strstream은 코드 또는 속도에서 최소한의 오버 헤드로 원하는 것을 정확하게 수행합니다. 이것은 논의와 유사합니다 허브 셔터에 의한 타조

다른 팁

실제로 원샷을 쓰는 것은 매우 사소한 일입니다 std::streambuf 버퍼를 제자리에 사용하여 모든 가상 함수의 기본 동작으로 사용합니다. std::streambuf '올바른 일'을합니다. 당신은 그냥 할 수 있습니다 setg 건축의 읽기 영역 및 underflow 그리고 uflow 안전하게 돌아올 수 있습니다 traits_type::eof() 초기 GET 영역의 끝이 스트림의 끝입니다.

예 :

#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();
}

boost.iostreams에는 stringstream처럼 작동하는 스트림이 있지만 기본 배열을 감싸서 데이터를 복사하지 않아도됩니다.

STD :: StringStream은 항상 자체 내부 버퍼를 만듭니다

테스트 할 가치가 있지만 테스트할만한 가치가 있습니다 ...

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

그런 다음 해당 세트 블로브 기능을 SS로 호출하십시오. JALF가 이미 언급했듯이 STD :: StringStream에 내부 버퍼가 여전히 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top