Я пытаюсь использовать 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;
Мне было интересно, есть ли лучший способ, хотя