В принципе ваш подход не плохой.И нет оптимального решения.Есть около 42 миллионов решений :-)
Есть несколько необходимых оптимизаций.Все они показаны в комментариях под вашим вопросом.
И цикл while можно просто выполнить, протестировав переменную filestream.Оператор bool!перегружен для этого типа переменной.Результат будет ложным в случае ошибки.Также для eof (конец файла).
Я хотел бы показать вам более подход "C ++" или "объектно-ориентированный".Вы начинаете думать о том, что хотите сделать, а затем выводите из этого инструкцию.Очевидно, вы хотите прочитать что-то вроде 2 байтов и сравнить эти 2 байта с некоторым заданным значением.Хорошо, тогда давайте определим новый класс TwoBytes.Мы добавляем некоторые функции, так что 2 байта могут быть прочитаны из любого потока.И поскольку мы хотим сравнить позже, мы добавляем оператор сравнения.Все очень прямо вперед.И только одно возможное решение.Вы можете добавить еще много функций.,.
Позже это даст вам представление о разработке программного обеспечения или архитектуре программного обеспечения.Когда вы немного опытнее, вы, возможно, заметите, что это забавная часть.
Так что, пожалуйста, посмотрите ниже в качестве примера.
#include <iostream>
#include <vector>
#include <array>
#include <fstream>
#include <algorithm>
#include <iterator>
using Byte = char;
// An ultra simple class
struct TwoBytes {
// Hold 2 bytes
std::array<Byte,2> tb;
// Define comparison operator
bool operator == (const TwoBytes& other) { return tb == other.tb; }
// And overlaod extractor operatror >> . With tha we can easily read 2 bytes
friend std::istream& operator >> (std::ifstream& ifs, TwoBytes& b) {
// In case of odd file size, we set the 2nd value to 0
b.tb[1] = 0;
return ifs >> b.tb[0] >> b.tb[1];
}
};
int main(void)
{
const TwoBytes compareValue1 = { '1', '2' };
const TwoBytes compareValue2 = { 0x34, 0x45 };
// Open the file
std::ifstream inputFileBinary("r:\\abc.dat", std::ios::binary);
// We will read the input data to this value
TwoBytes twoBytes{};
// This is the loop to read the values
while (inputFileBinary) {
// Read 2 bytes
inputFileBinary >> twoBytes;
// In case of odd file size, inputFileBinary would be false. So you could check with "if (inputFileBinary)"
// Compare values and show result
if (twoBytes == compareValue1 || twoBytes == compareValue2) {
std::cout << "Found value\n";
}
else {
std::cout << "Did not find value\n";
}
}
return 0;
}
Надеюсь, это немного поможет,,.