使用istream_iterator可以轻松地将文件读入字节数组。
例如:
std::ifstream afile(somefile);
noskipws(afile);
...
std::vector<uint_8> vOfBytes = { std::istream_iterator<uint8_t>(afile),
std::istream_iterator<uint8_t>() };
我现在需要能够对矢量和字符串做同样的事情。问题是这些尺寸非常大。
例如:
std::string astring = "abc";
std::wstring awstring = L"abc";
std::vector avector<uint32_t> = { 0, 1, 2, 3 };
// std::distance(asv.begin(), asv.end()) == 3
std::vector<uint8_t> asv = { /* astring to std::vector<uint8_t> */ };
// std::distance(awsv.begin(), awsv.end()) == 6
std::vector<uint8_t> awsv = { /* awstring to std::vector<uint8_t> */ };
// std::distance(uiv.begin(),uiv.end()) == 16
std::vector<uint8_t> uiv = { /* avectorto std::vector<uint8_t>*/};
我一直在查看cpp引用,并且没有遇到过将上面视为不必滚动我自己的流的字节流的方法。 有没有人有任何可以指向我的建议或参考?我将不胜感激。
答案 0 :(得分:3)
您可以使用完全相同的迭代器构造函数
#include <string>
#include <vector>
#include <iostream>
int main()
{
std::string astring = "abc";
std::wstring awstring = L"abc";
std::vector<uint32_t> avector{ 0, 1, 2, 3 };
std::vector<uint8_t> asv{
reinterpret_cast<uint8_t const*>(astring.data()),
reinterpret_cast<uint8_t const*>(astring.data() + astring.size()),
};
std::vector<uint8_t> awsv{
reinterpret_cast<uint8_t const*>(awstring.data()),
reinterpret_cast<uint8_t const*>(awstring.data() + awstring.size()),
};
std::vector<uint8_t> uiv{
reinterpret_cast<uint8_t const*>(avector.data()),
reinterpret_cast<uint8_t const*>(avector.data() + avector.size()),
};
std::cout << std::hex;
for (auto v : asv)
std::cout << static_cast<int>(v) << ' ';
std::cout << '\n';
for (auto v : awsv)
std::cout << static_cast<int>(v) << ' ';
std::cout << '\n';
for (auto v : uiv)
std::cout << static_cast<int>(v) << ' ';
std::cout << '\n';
}