小编lor*_*ger的帖子

从stringstream中删除char并附加一些数据

在我的代码中有一个循环,它将"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++ stringstream

19
推荐指数
5
解决办法
4万
查看次数

protobuf:从C#中读取C++中的消息

我将读取从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)

c# protocol-buffers protobuf-net

7
推荐指数
1
解决办法
4919
查看次数

使用back_inserter复制算法

我不明白为什么这段代码是准确的

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)

c++ stl-algorithm

5
推荐指数
2
解决办法
2029
查看次数

如何在protobuf-net中手动将可选字段添加到类中

在我的.proto中,我有一些包含可选字段的消息.Debian没有本机原型,所以我没有一个可以试验(懒得自己编译:).

你能告诉我如何在C#中的类中实现可选字段吗?我想有一个函数或任何设置字段的idicate(在C++中我有像hasfoo()).在我在互联网上发现的例子中,没有类似的东西.

c# protobuf-net

4
推荐指数
1
解决办法
2392
查看次数

选择说套接字是准备好读的时候肯定没有(实际上已经关闭)

在我的服务器中,我检查是否有任何套接字可以使用select()来确定它.因此,select()每次迭代时都会执行主循环.

为了测试服务器,我写了一个简单的客户端,只发送一条消息,然后退出.BTW.我使用协议缓冲区来发送信息 - 消息表示此库中类型为Message的对象.

测试会话看起来像:

  1. select()
  2. 服务器的套接字准备好读取
  3. accept() 客户端的套接字
  4. 从客户端套接字读取消息
  5. select()
  6. 服务器的套接字没有准备好读取,客户端就准备好了
  7. 从客户端套接字读取消息

最后一步是错误的,因为客户端已经关闭了连接.因此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)

c network-programming

3
推荐指数
1
解决办法
3651
查看次数

Rcpp检查列表是否有元素

我的程序处理群集.除数据集外,用户还必须指定有关集群的一些细节.有两种方法可以解决这个问题:指定群集数量或准备群集描述列表.

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()吗?

rcpp

3
推荐指数
1
解决办法
781
查看次数

tcp/ip是否传达完整的消息?

我正在构建一个库,用于维护c ++中应用程序之间的网络连接.在一些debuging期间,我发现从socket获得的一些信息似乎不完整.至关重要的是这个信息是完整的,因为如果我用协议缓冲区的库解码它,我需要完整的消息.

这种现象不是一成不变的.有时我从套接字获取所有数据,有时不是.测试过程如下:启动服务器,多次启动客户端.我得到的是从receive()描述某些变量值如何变化的函数输出.其中一个是我用来存储数据的缓冲区的大小.该大小告诉我缓冲区中有多少数据.在此特定测试中,客户端发送两个大小为3(字节)的消息.我希望缓冲区大小是3的倍数.但是,有时大小是4!这意味着程序读取一个完整的消息和第二个消息的1/3.我不明白为什么我总是先完成消息.否则,protobuf将终止该程序.

我认为tcp/ip应该注意我得到完整的消息.我的问题是我不知道提前的大小.我希望收到完整的信息,以便我可以将其解释为核心.

network-programming tcp

2
推荐指数
1
解决办法
921
查看次数