如何将char*转换为std::vector?

35

我有一个 char* 变量:

// char* buffer;
// ...
fread (buffer, 1, lSize, pFile);
// ...

如何将它转换为std :: vector?强制转换会导致错误。

3个回答

104
std::vector<char> data(buffer, buffer + size);

如果您能这样做,James McNellis的答案更好。


40
尽管詹姆斯的回答鼓励编写更好的代码,但这个回答是对这个问题的正确回答。有时你只是从一个 char* 开始。 - enobayram
3
这个操作是复制缓冲区里的数据还是只是将其包装起来? - Ray Hulha
1
@RayHulha 它复制了数据。 - Oren Bengigi

20

为什么不先使用 std::vector

std::vector<char> buffer(lSize);
std::fread(&buffer[0], 1, buffer.size(), pFile);

33
因为他有一个 char * - Erik Aronesty

14

你不能在char*和vector之间进行转换;指针转换会导致结果与输入具有完全相同的字节,因此通常情况下不是一个好主意,除非你要进行低级别的位操作。

假设你想要构建一个字符向量,你可以创建一个新的类型为std::vector<char>的向量对象(请注意,您需要提供向量元素的类型),并通过将起始和结束指针传递给构造函数来初始化它:

std::vector<char> vec(buffer, buffer+lSize);
请注意第二个参数是“结束指针”,在C++中非常常见。重要的是,它是缓冲区末尾字符后面的指针,而不是缓冲区中的最后一个字符。换句话说,起始点是包含的,但结束点是排除的。
另一种可能性(因为你在处理字符)是使用std::string。这可能是你想要的(根据你是将char*视为字符串还是字节数组而定)。你可以用同样的方式构建它:
std::string str(buffer, buffer+lSize);

或使用不同的构造函数,将大小作为第二个参数传入:

std::string str(buffer, lSize);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接