gpt4 book ai didi

c++ - 如何使用 std::istringstream 获取正确的缓冲区大小以进行数据解析

转载 作者:行者123 更新时间:2023-11-30 04:52:43 27 4
gpt4 key购买 nike

我正在通过 zeromq TCP 套接字发送可变大小的消息。在示例中 http://zguide.zeromq.org/cpp:wuclient建议使用 std::istringstream解析数据。问题是,它没有考虑到不同的缓冲区大小。我最终将较长的前一条消息的结尾附加到较短的消息的末尾。

简单的std::string(static_cast<char*>(request.data()), request.size());可以很好地获取整个消息,但我想使用 std::istringstream ,因为我要传递不同的数据类型(原始数据类型 + std::string 作为最后一个变量),所以 std::istringstream可能是消息解析的不错选择。

所以这里会将整个消息正确地放入 rpl 变量中

zmq::message_t request;
// Wait for next request from client
socket_.recv (&request);
auto rpl = std::string(static_cast<char*>(request.data()), request.size());
std::cout << rpl << std::endl;

但这不会:

zmq::message_t request;
// Wait for next request from client
socket_.recv (&request);
std::istringstream iss(static_cast<char*>(request.data()));
std::string rpl;
iss >> rpl;
std::cout << rpl << std::endl;

我怎样才能绕过它并告诉std::istringstream获得正确字符串长度的实际缓冲区大小是多少?

最佳答案

怎么样:

std::stringstream iss;
iss.write(static_cast<char*>(request.data()), request.size());

通过读写字符串流及其write 函数,您可以完全控制写入指针后面的字节数。那么您不需要使用stringstream构造函数来填充缓冲区,它从您的char*隐式构造一个std::string,没有长度限制。除非您的数据以 null 结尾,否则无法正常工作。

(有关字符串流的可用功能,请参阅 here。)

如果您完全受限于 std::istringstream,它没有输出功能,因此您必须创建 string 参数显式地(使用它自己的长度感知构造函数),如 Sam 所示。不幸的是,这会额外复制一次整个缓冲区。我发现很难相信使用 std::istringstream 是值得的。

关于c++ - 如何使用 std::istringstream 获取正确的缓冲区大小以进行数据解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54180886/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com