-edit-我发送的是二进制而不是字符串.我的测试是使用html页面所以在这个例子中我只使用一个字符串但我的问题是关于二进制,向量和使用ostream进行调试.我让这清楚了一些混乱.
我有以下代码:
cout << string(&v[0]).substr(0, len);
有没有更好的方法来打印字符串v与cout长度len?我想做v [len] = 0但是我的一个断言被抛出,大小为1.我的代码是:
vectorv; v.reserve(1024*16); //required v.resize(1); //so we can do &v[0] recv(sockfd, &v[0], v.capacity(), 0); while (l > 0) { cout << string(&v[0]).substr(0, l); recv(sockfd, &v[0], v.capacity(), 0); } cout << "the size is " << v.size();
SCFrench.. 7
您可以在cout对象上使用ostream :: write方法:
#include#include using namespace std; int main() { vector test; test.push_back('a'); test.push_back('b'); test.push_back('c'); cout.write(&test[0], 3); cout << endl; }
输出:
ABC
由于ostream :: write返回一个ostream并包含*this,你甚至可以这样做
cout.write(&test[0], 3) << endl;
但我不确定这实际上是否更好(或更清晰).
您可以在cout对象上使用ostream :: write方法:
#include#include using namespace std; int main() { vector test; test.push_back('a'); test.push_back('b'); test.push_back('c'); cout.write(&test[0], 3); cout << endl; }
输出:
ABC
由于ostream :: write返回一个ostream并包含*this,你甚至可以这样做
cout.write(&test[0], 3) << endl;
但我不确定这实际上是否更好(或更清晰).
vectorv; v.reserve(1024*16); //required v.resize(1); //so we can do &v[0] recv(sockfd, &v[0], v.capacity(), 0);
那段代码有一个bug.调用reserve
只能保证你可以推送至少那么多元素,直到向量的引用和迭代器再次失效(通过可能重新分配使用的缓冲区).这会不会让你写中V [0..1024*16-1],如同你那里recv
.你必须做
v.resize(1024*16); //required
实际上有很多元素可用,而实际上是传递v.size()
而不是v.capacity()
.
对于你的子串操作,我可能会这样做
std::string str(&v[0], n); std::cout << str;
其中n的范围从0到v.size().你可以std::min(n, v.size())
用来保证,如果你的情况下n可能更大,你需要一个上限.
(在一个侧节点上,我会避免在那里有一个名为"l"(ell)的变量,因为它看起来非常像"1"(一个),这可能会混淆地狱之人