Определите, имеют ли все байты в определенном диапазоне значение c, используя алгоритм istreambuf_iterator + - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь использовать all_of, чтобы проверить, все ли байты в определенном диапазоне в файле равны определенному значению. Чтобы проверить весь файл, это достаточно просто; Например, если вы хотите знать, все ли байты в test.txt равны 0xff:

#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>
using namespace std;

int main() {
  ifstream ifs("test.txt");
  istreambuf_iterator<char> it(ifs);
  istreambuf_iterator<char> eos;
  if(all_of(it, eos, [](unsigned char c) {
    return c == 0xff;
  })) {
    cout << "all bytes are 0xff" << endl;
  }
  else
    cout << "not all are 0xff" << endl;
}

Однако я не знаю, как это сделать для определенного диапазона c вместо всего файла. Допустим, у меня есть 16-байтовый файл test.txt, содержимое которого таково:

$ xxd test.txt
00000000: aaaa aaaa ffff ffff ffff ffff aaaa aaaa  ................

Я хочу знать, все ли 8 байтов между байтом 4 и байтом 11 0xFF (как указано выше):

ifstream ifs("test.txt");
istreambuf_iterator<char> it(ifs);
advance(it, 4);
if(all_of(it, it + 8, [](unsigned char c) {
  return c == 0xff;
})) {
  cout << "all bytes are 0xff" << endl;
}
else
  cout << "not all are 0xff" << endl;

Второй параметр all_of() явно неверен, потому что operator+, похоже, не определен для этой операции. Я думал об использовании второго istreambuf_iterator для того же ifstream, который я бы продвинул до байта 11 перед вызовом all_of, но это продвинуло бы оба итератора, поскольку они являются входными итераторами (для ответа здесь: Почему разве istreambuf_iterator advance не работает )

Любой способ сделать то, что я хочу, с помощью all_of или другого алгоритма C ++?

Примечание: я знаю, что я хочу сделать, можно также можно выполнить с seekg, read и a для l oop:

ifstream ifs("test.txt");
ifs.seekg(4, ios::beg);
unsigned char byte;
bool all_are_ff = true;
for(auto i=0u; i<8; i++){
  ifs.read((char*)&byte, 1);
  if (byte != 0xffu){
    cout << "not all are 0xff" << endl;
    all_are_ff = false;
    break;
  }
}
if(all_are_ff) cout << "all bytes are 0xff" << endl;

Мне было интересно, есть ли лучший способ, хотя

...