如何将字符向量转换为字符串流?

5

有没有可能将char向量转换为std::stringstream?例如:

std::vector<unsigned char> data;
std::stringstream st(????);

有没有办法将data的值赋给st

我尝试过以下代码:"std::stringstream ss; std::string str(CL_Data.begin(),CL_Data.end()); ss.str(str);",它可以工作,但我正在寻找从向量直接转换为stringstream的方法。 - Rahul_cs12
3个回答

14

如果我们查看std::stringstream的构造函数,我们可以看到第二个是:

explicit basic_stringstream( const std::basic_string<CharT,Traits,Allocator>& str,
                ios_base::openmode mode = ios_base::in|ios_base::out );

basic_string 的构造函数包括:

template< class InputIt >
basic_string( InputIt first, InputIt last, 
              const Allocator& alloc = Allocator() );

因此,我们可以这样做:

std::vector<unsigned char> data(20);

std::stringstream st(std::string(data.begin(), data.end()));

1
提供了vec向量和strstr(o)字符串流:
copy(vec.begin(), vec.end(), ostream_iterator<char>(strstr));

1
如果您尝试执行以下操作:
std::stringstream st(data.data());

您将从gcc获得以下错误:
错误:无效的用户定义转换,从“unsigned char *”到“const __string_type& {aka const std :: basic_string&}”[-fpermissive]
请注意,gcc正在尝试将参数转换为std :: string Barry建议在其答案中显式构造std :: string
但是,如果您的std :: vector<unsigned char> data以空字符结尾,则可以利用隐式构造。 您只需要更改为可以从std :: string构造的内容即可。
std::stringstream st(reinterpret_cast<char*>(data.data()));

一个可能更简单的解决方案是将 std::vector<unsigned char> data 的类型更改为 std::vector<char> data。在这种情况下,不需要进行转换:

std::stringstream st(data.data());

3
这段代码存在读取越界的风险——不能保证 OP 的 std::vector<unsigned char> 中的内容以空字符结尾! - LThode
@LThode 这是一个我没有考虑到的很好的观点。我已经将这个条件添加到答案中了。 - Jonathan Mee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接