在我的代码中有一个循环,它将"number"添加到stringstream.当它结束时,我需要提取','添加'}'并添加'{'如果要重复循环.
我以为我可以使用ignore()删除','但它不起作用.你知道我怎么做我描述的吗?
例:
douCoh << '{';
for(unsigned int i=0;i<dataSize;i++)
if(v[i].test) douCoh << i+1 << ',';
douCoh.get(); douCoh << '}';
Run Code Online (Sandbox Code Playgroud) 我将读取从C#服务器发送的C++客户端中连续存储的消息.我希望我能读出这样一条消息的大小:
google::protobuf::uint32 m;
coded_input->ReadVarint32(&m);
cout << m << endl;
Run Code Online (Sandbox Code Playgroud)
然后我想阅读消息:
Person person;
CodedInputStream::Limit limit = coded_input->PushLimit(m);
person.ParseFromCodedStream(coded_input);
coded_input->PopLimit(limit);
Run Code Online (Sandbox Code Playgroud)
C#代码如下:
var person = new Person { Id = 123456, Name = "Fred", Address = new Address { Line1 = "Flat 1", Line2 = "The Meadows ar gar? " } };
Stream str = new NetworkStream(socket);
Serializer.SerializeWithLengthPrefix(str, person, PrefixStyle.Fixed32);
Run Code Online (Sandbox Code Playgroud)
它不起作用.
我得到C++错误(43是cout << m << endl;的结果)(id,name,address都是Person中的所有字段)
43
libprotobuf错误google/protobuf/message_lite.cc:123]无法解析"Person"类型的消息,因为它缺少必填字段:id,name,address
当我没有阅读变体并直接解析消息时coded_input
,一切都很好(当我更改SerializeWithLengthPrefix
为服务器代码中的序列化时).但是我需要一种方法来区分连续的消息,所以我需要知道我要阅读的消息的大小.我只是不知道如何发送大小.
我试过了:
Stream buf = new MemoryStream();
Serializer.Serialize(buf, person);
ProtoWriter writer …
Run Code Online (Sandbox Code Playgroud) 我不明白为什么这段代码是准确的
vector<int> coll;
coll.reserve(2*coll.size());
copy (
coll.begin(), coll.end(), // zrodlo
back_inserter(coll) // przeznaczenie
);
Run Code Online (Sandbox Code Playgroud)
coll.end()
代表矢量的结束.在我推回任何东西(如同back_insert_iterator
)后,coll.end()
返回的内容与之前的内容相同或不同之处?是否有多个终止迭代器?为什么end()可以用作容器的末尾,即使添加了新内容?
此外,您无法将代码应用于列表容器 - 它会卡住.这很重要,因为在向量的情况下,push_back使得迭代器在重新分配数据(何时size()==capacity()
和push_back()
被调用)后不可靠,而在列表的情况下则不是这样.为什么代码挂起列表?
编辑:(sscce)
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
template <class T>
inline void PRINT_ELEMENTS (const T& coll, const char* optcstr="")
{
typename T::const_iterator pos;
std::cout << optcstr;
for (pos=coll.begin(); pos!=coll.end(); ++pos) {
std::cout << *pos << ' ';
}
std::cout << std::endl;
}
int main(){
list<int> coll;
list<int>::iterator end = coll.end(); …
Run Code Online (Sandbox Code Playgroud) 在我的.proto中,我有一些包含可选字段的消息.Debian没有本机原型,所以我没有一个可以试验(懒得自己编译:).
你能告诉我如何在C#中的类中实现可选字段吗?我想有一个函数或任何设置字段的idicate(在C++中我有像hasfoo()).在我在互联网上发现的例子中,没有类似的东西.
在我的服务器中,我检查是否有任何套接字可以使用select()
来确定它.因此,select()
每次迭代时都会执行主循环.
为了测试服务器,我写了一个简单的客户端,只发送一条消息,然后退出.BTW.我使用协议缓冲区来发送信息 - 消息表示此库中类型为Message的对象.
测试会话看起来像:
select()
accept()
客户端的套接字select()
最后一步是错误的,因为客户端已经关闭了连接.因此protobuf库得到了Segmentation fault
.我想知道为什么FD_ISSET表示套接字在关闭时已在步骤6中准备就绪.如何检查插座是否关闭?
编辑:
我已经找到了如何检查套接字是否打开
int error = 0;
socklen_t len = sizeof (error);
int retval = getsockopt (socket_fd, SOL_SOCKET, SO_ERROR, &error, &len );
Run Code Online (Sandbox Code Playgroud) 我的程序处理群集.除数据集外,用户还必须指定有关集群的一些细节.有两种方法可以解决这个问题:指定群集数量或准备群集描述列表.
args <- list(dataset=points, K=5)
args <- list(dataset=points, clusters=list(
list(type="spherical",radius=4),
list(type="covariance",covMat=matrix)
)
Run Code Online (Sandbox Code Playgroud)
接下来你用R中的args作为参数调用正确的函数(我的程序).
classification <- CEC(args)
Run Code Online (Sandbox Code Playgroud)
我想像下面这样准备CEC
SEXP CEC(SEXP args) {
Rcpp::List list(args);
arma::mat dataset = Rcpp::as<arma::mat>(list["dataset"]);
if(list.contains("K")) {
//something
} else if(list.contains("clusters")) {
//something
}
}
Run Code Online (Sandbox Code Playgroud)
我找不到任何API列表或示例如何做到这一点.而且,我研究Rcpp的标题但是List的定义typedef Vector<VECSXP> List ;
几乎没有帮助.
有什么我可以用而不是list.contains()
吗?
我正在构建一个库,用于维护c ++中应用程序之间的网络连接.在一些debuging期间,我发现从socket获得的一些信息似乎不完整.至关重要的是这个信息是完整的,因为如果我用协议缓冲区的库解码它,我需要完整的消息.
这种现象不是一成不变的.有时我从套接字获取所有数据,有时不是.测试过程如下:启动服务器,多次启动客户端.我得到的是从receive()
描述某些变量值如何变化的函数输出.其中一个是我用来存储数据的缓冲区的大小.该大小告诉我缓冲区中有多少数据.在此特定测试中,客户端发送两个大小为3(字节)的消息.我希望缓冲区大小是3的倍数.但是,有时大小是4!这意味着程序读取一个完整的消息和第二个消息的1/3.我不明白为什么我总是先完成消息.否则,protobuf将终止该程序.
我认为tcp/ip应该注意我得到完整的消息.我的问题是我不知道提前的大小.我希望收到完整的信息,以便我可以将其解释为核心.