Как вы читаете n байтов из файла и помещаете их в векториспользуя итераторы? - PullRequest
0 голосов
/ 23 мая 2018

Исходя из этого, этот вопрос:

Как прочитать двоичный файл в вектор беззнаковых символов

В ответе они имеют:

std::vector<BYTE> readFile(const char* filename)
{
    // open the file:
    std::basic_ifstream<BYTE> file(filename, std::ios::binary);

    // read the data:
    return std::vector<BYTE>((std::istreambuf_iterator<BYTE>(file)),
                              std::istreambuf_iterator<BYTE>());
}

, который считывает весь файл в вектор.

То, что я хочу сделать, это читать (например) 100 байтов за раз в векторе, затем делать вещи, а затем читать следующие 100 байтовв вектор (очистить вектор между).Я не вижу, как указать, сколько файла для чтения (например, как настроить итераторы).Это вообще возможно?

Я пытаюсь избежать необходимости писать собственный цикл кода для копирования каждого байта за раз.

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Вы можете написать функцию для:

void readFile( const std::string &fileName, size_t chunk, std::function<void(const std::vector<BYTE>&)> proc )
{
    std::ifstream f( fileName );
    std::vector<BYTE> v(chunk);
    while( f.read( v.data(), v.size() ) ) {
        v.resize( f.gcount() );
        proc( v );
        v.resize( chunk );
    }
}

, тогда использование будет простым:

void process( const std::vector<BYTE> &v ) { ... }

readFile( "foobar", 100, process ); // call process for every 100 bytes of data

или вы можете использовать лямбда и т. Д. Для обратного вызова.

0 голосов
/ 23 мая 2018

Или вы можете написать свою собственную функцию для этого:

template<typename Data>
std::istreambuf_iterator<Data> readChunk(std::istreambuf_iterator<Data>& curr, std::vector<Data>& vec, size_t chunk = 100) {
    for (int i = 0; curr != std::istreambuf_iterator<Data>() && i < chunk; ++i, ++curr) {
        vec.emplace_back(*curr);
    }
    return curr;
}

и использовать ее как:

std::ifstream file("test.cpp");
std::vector<BYTE> v;
std::istreambuf_iterator<BYTE> curr(file);
readChunk<BYTE>(curr, v);

И вы можете вызвать эту функцию снова.

0 голосов
/ 23 мая 2018

Вы можете использовать ifstream::read для этого.

std::vector<BYTE> v(100);
while ( file.read(reinterpret_cast<char*>(v.data()), 100) )
{
   // Find out how many characters were actually read.
   auto count = file.gcount();

   // Use v up to count BTYEs.
}
...