Прочитать каждые 2 байта из файла данных и сравнить в векторе - PullRequest
0 голосов
/ 01 июля 2019

Я новичок в C ++. У меня есть задание, где я должен прочитать файл двоичных данных Little Endian, а в файле данных я должен читать каждые 2 байта и проверять значение заголовка. Я написал следующий код, но я не получаю правильные данные. Может кто-нибудь подсказать мне, как подойти к этой проблеме.

std::vector<char> checkValues = { (char)0xCA5E , (char)0xBEAD };
std::ifstream input("abc.dat", std::ios::binary | std::ios::in);
if (input)
{
    input.seekg(0, ios::end);
    size_t fileSize = input.tellg();
    input.seekg(0, ios::beg);
    /*How to run loop here for every two byte*/
    {
        char * buffer = new char[2];
        input.read(buffer, sizeof(buffer) / sizeof(*buffer));
        std::vector<char>::iterator it = std::find(checkValues.begin(), checkValues.end(), buffer);
        if (it != checkValues.end())
            std::cout << "Element Found" << std::endl;
        else
            std::cout << "Element Not Found" << std::endl;
        delete[] buffer;
    }
}

У меня есть сомнения по поводу моего подхода, я все еще учусь. Пожалуйста, если вы можете направить меня к лучшему решению, которое было бы полезно. Спасибо.

1 Ответ

0 голосов
/ 01 июля 2019

В принципе ваш подход не плохой.И нет оптимального решения.Есть около 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;
}

Надеюсь, это немного поможет,,.

...