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

时间:2012-08-29 11:33:20

标签: 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;
}

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

5 个答案:

答案 0 :(得分:6)

您想向向量添加多个unsigned char个对象,但push_back只会添加一个。

因此,请将retbuf.push_back(*outbuf);替换为:

for (size_t i = 0; i < sizeof(outbuf); ++i) {
    retbuf.push_back(outbuf[i]);
}

std::copy(outbuf, outbuf+sizeof(outbuf), std::back_inserter(retbuf));

retbuf.insert(retbuf.end(), outbuf, outbuf+sizeof(outbuf));

所有人都做同样的事情。

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

buffer_t retbuf(0x40 * reports);

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

buffer_t retbuf;

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

retbuf.reserve(0x40 * reports);

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

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

const int report_size = 0x40;

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

答案 1 :(得分:1)

问题在于这一行:buffer_t retbuf(0x40 * reports);这意味着你创建了带有0x40 * reports元素的向量,这些元素填充了unsigned char(零)的默认值。然后push_back()只是在向量的末尾添加新元素,而不会影响现有元素。

您需要以这种方式重写:

buffer_t retbuf;                  // Empty vector
retbuf.reserve(0x40 * reports);   // Preallocate memory for known element count

这种方式push_back()将按预期工作,并从头开始向空向量添加元素。

当然,你应该push_back()outbuf的所有元素,而不仅是第一个(*outbuf)。

答案 2 :(得分:1)

要回退多个值,请使用std :: vector&#39的函数赋值。例如:

std::vector<char>vec1;
char array[3] = {'a', 'b', 'c'};
vec1.assign(array, array+3);

我目前正在开展一个项目,我必须这样做。

答案 3 :(得分:0)

您的矢量属于unsigned char类型,这意味着它的每个元素都属于此类型。您的outbuf是无符号字符的数组

push_back()只会将一个项目附加到向量的末尾,因此push_back(*outbuf)只会将outbuf的第一个元素添加到向量中,而不是全部。

要将所有数据放入向量中,您需要逐个push_back,或使用std::copy

答案 4 :(得分:0)

请注意,由于outbuf是一个char数组,因此* outbuf将是char数组的第一个元素,因为数组/指针具有二元性。

我想你可能想这样做:

typedef vector<string> buffer_t; // alternatively vector<unsigned char*>
...
retbuf.push_back(outbuf);
...

typedef vector<unsigned char> buffer_t;
...
for (size_t i = 0; i < sizeof(outbuf); i++)
     retbuf.push_back(outbuf);
...