2017-01-03 9 views
1

У меня есть указатель на const *char буфер, а также его длина, и я пытаюсь использовать API (в данном случае, AWS S3 C++ upload request), который принимает объект типа:Const символ * в STD :: basic_iostream

std::basic_iostream <char, std::char_traits <char>> 

Есть ли простой стандартный способ C++ 11 для преобразования моего буфера в совместимый поток, желательно без фактического копирования по памяти?

+0

Когда вы говорите 'У меня есть указатель на константный * символ buffer' вы на самом деле означает, что у вас есть указатель на' сопзЬ полукокса * буфера [N] ', или вы намеревались сказать, что у вас есть указатель на буфер с нулевым завершением?)? – user2079303

+0

@ пользователь2079303 - последний. Это двоичный буфер данных, поэтому он не обязательно заканчивается нулем. – nbubis

+0

[This] (http://stackoverflow.com/questions/2079912/simpler-way-to-create-ac-memorystream-from-char-size-t-without-copying-t) вопрос относится ко мне – UKMonkey

ответ

3

Благодаря комментарий Игоря, это похоже на работу:

func(const * char buffer, std::size_t buffersize) 
{  
    auto sstream = std::make_shared<std::stringstream>(); 
    sstream->write(buffer, buffersize); 
    ... 
    uploadRequest.SetBody(sstream);  
    .... 
+1

@MarkR - Вероятно, лучше всего добавить это в качестве ответа. – nbubis

+0

Я думал, что это был тот ответ, который я тоже искал. Но он не компилируется: 'no member named 'write' in 'std :: __ 1 :: basic_istringstream , std :: __ 1 :: allocator >'' – ndtreviv

+0

Собственно, это компилируется, если вы используете флаг 'std :: stringstream :: out' при вызове' make_shared'. – ndtreviv

2

В довольно очевидное следствие вашего решения, вы можете создать пустой basic_iostream с кодом, как это. В этом примере создается 0-байтовый ключ псевдо-каталог S3:

Aws::S3::Model::PutObjectRequest object_request; 
// dirName ends in /.    
object_request.WithBucket(bucketName).WithKey(dirName); 
// Create an empty input stream to create the 0-byte directory file. 
auto empty_sstream = std::make_shared<std::stringstream>();  
object_request.SetBody(empty_sstream); 
auto put_object_outcome = s3_client->PutObject(object_request);