我一直想知道以下问题:假设我有一个C样式函数将原始数据读入缓冲区
int recv_n(int handle, void* buf, size_t len);
我是否可以直接将数据读入std:string
或stringstream
而无需分配任何时间缓冲区?例如,
std::string s(100, '\0');
recv_n(handle, s.data(), 100);
我猜这个解决方案有一个未定义的结果,因为,afaik,string::c_str
和string::data
可能会返回一个临时位置,并不一定会将指针返回到内存中的实际位置,由对象使用存储数据。
有什么想法吗?
答案 0 :(得分:10)
为什么不使用vector<char>
代替string
?这样你就可以做到:
vector<char> v(100, '\0');
recv_n(handle, &v[0], 100);
这对我来说似乎更惯用,特别是因为你没有将它用作字符串(你说它是原始数据)。
答案 1 :(得分:8)
是的,在C ++ 11之后。
但您无法使用s.data()
,因为它会返回char const*
尝试:
std::string s(100, '\0');
recv_n(handle, &s[0], 100);
根据情况,我可能选择了std :: vector&lt; char&gt;特别是对于原始数据(尽管这完全取决于应用程序中数据的使用情况)。