2015-08-25 5 views
1

Чтение файлов в массив байтов можно легко выполнить с помощью 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

Ваш первый пример лишит пропуски, 'istream_iterator's эквивалентны использованию' 'оператор >>. – user657267

+0

Спасибо @ user657267, я использовал его больше из того, что было после, и не добавил набор no skip ws. Я уточню вопрос. – Freddy

ответ

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'; 
} 
+0

Спасибо. Вы не представляете, насколько сложным было мое решение. – Freddy

+0

@Freddy Если бы это было что-то похожее на то, что я писал, прежде чем я действительно понял итераторы, я думаю, что у меня есть идея! – user657267