如何将多个char读取组合到std :: vector中?

And*_*y E 3 c++

我正在从HID设备读取多个报告unsigned char,然后尝试将数据复制到std::vector.我也将数据写入文件进行十六进制分析,当我查看它时,其内容似乎是正确的.但是,std::vector当我将其转储到控制台时,似乎不包含正确的数据.

这是代码:

typedef vector<unsigned char> buffer_t;

buffer_t sendCommand (hid_device *devh, const unsigned char cmd[], int reports) {
    unsigned char outbuf[0x40];
    buffer_t retbuf(0x40 * reports);

    hid_write(devh, cmd, 0x41);

    int i;
    FILE *file = fopen("test.out", "w+b");
    while (i++ < reports) {
       hid_read(devh, outbuf, 0x40);
       fwrite(outbuf, 1, sizeof(outbuf), file);
       retbuf.push_back(*outbuf);
    }
    fclose(file);
    cout << &retbuf[0];
    return retbuf;
}
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,我在这里不合时宜; 我是C/C++的新手,现在我已经坚持了一段时间.任何人都可以告诉我我做错了什么,还是指出我的方向更好?

Ste*_*sop 6

您想要向unsigned char矢量添加多个对象,但push_back只添加一个.

所以,替换retbuf.push_back(*outbuf);为:

for (size_t i = 0; i < sizeof(outbuf); ++i) {
    retbuf.push_back(outbuf[i]);
}
Run Code Online (Sandbox Code Playgroud)

要么

std::copy(outbuf, outbuf+sizeof(outbuf), std::back_inserter(retbuf));
Run Code Online (Sandbox Code Playgroud)

要么

retbuf.insert(retbuf.end(), outbuf, outbuf+sizeof(outbuf));
Run Code Online (Sandbox Code Playgroud)

这一切都做同样的事情.

您可以使用特定大小创建矢量:

buffer_t retbuf(0x40 * reports);
Run Code Online (Sandbox Code Playgroud)

但是push_back通过在末尾添加元素来增加向量的大小.你应该创建它为空:

buffer_t retbuf;
Run Code Online (Sandbox Code Playgroud)

或者,您可以安排向量分配足够的空间,为您要添加的元素做好准备:

retbuf.reserve(0x40 * reports);
Run Code Online (Sandbox Code Playgroud)

这纯粹是一个性能问题,但有时它对于大型向量或类型向量来说是一个重要问题,unsigned char当向量耗尽内部空间并且必须分配更多时,(不像)类型的向量复制/移动是昂贵的.

关于样式的注释:您重复0x40几次字面值,也可以使用sizeof(outbuf).通常最好定义一个常量,并在整个过程中使用该名称:

const int report_size = 0x40;
Run Code Online (Sandbox Code Playgroud)

部分原因在于未来数字会发生变化,而且还与代码的可读性有关 - 如果有人看到0x40他们可能会或可能不会立即理解为什么这是正确的价值.如果有人看到,report_size那么在他们查找之前他们不知道实际上是什么价值,但他们确实知道你为什么要使用这个价值.