从字符串流中的偏移读取

时间:2015-12-04 10:59:57

标签: c++ stringstream

我需要将我读过的标题和有效负载拆分成字符串流。

我在字符串流中找到了有效载荷开始的位置。

可以通过以下方式读取标题:

// where ss is the source stringstream
ssHeader.read(ss.str(), nDataStartPos-1);

现在我想将余数读入有效载荷字符串流。

ssPayload.read(ss.str()+nDataStartPos, nTotalBytesRed);

此操作失败,并出现以下错误:

  • 错误:从'const char *'无效转换为'char *'

  • 初始化'std :: basic_istream< _CharT,_Traits>&的参数1 std :: basic_istream< _CharT,_Traits> :: read(_CharT *,std :: streamsize)[with _CharT = char,_Traits = std :: char_traits]'

我猜测str()命令返回一个临时的,从stringstream的内部缓冲区构造。

所以我想我可以将ssPayload复制到一个字符串,然后做一个substr,但有没有更有效的方法来实现这个,或者stringstream是错误的工具?

2 个答案:

答案 0 :(得分:2)

你猜错了,是的,字符串流是错误的工具。

一般来说,我们会读入固定缓冲区,反复将其内容复制到您想要的内容中,直到读完所有内容。

是的那种糟透了。

您可以使用流迭代器和std::copy

答案 1 :(得分:1)

如果数据(标头和有效负载)是文本,则使用普通std::string并使用substr来提取标头和有效负载。

如果数据是二进制的,那么您可以使用std::vector<uint8_t>(或std::vector<int8_t>)并使用例如数据提取数据std::copy_n。但是,如果数据是二进制的,为什么不简单地使用包含所需精确数据的打包结构,包括标题(可能使用两个结构,一个用于标题,一个用于有效负载)?