从数据文件中读取每2个字节并在向量中进行比较

时间:2019-07-01 14:10:18

标签: c++ c++11 vector char byte

我是C ++的新手。我有一个作业,我必须读取Little Endian Binary数据文件,并且在数据文件中必须每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 :(得分:0)

基本上,您的方法还不错。并且没有最佳解决方案。大约有4200万种解决方案:-)

有一些必要的优化。它们都显示在您问题下方的评论中。

ands while循环可以简单地通过测试filestream变量来完成。 “布尔运算符!”对于该变量类型过载。如果出现错误,结果将为假。也用于eof(文件末尾)。

我想向您展示更多的“ C ++”或“面向对象”方法。您开始思考您想做什么,然后从中得出方法。显然,您希望读取2个字节的内容,并将这2个字节与给定值进行比较。好的,接下来让我们定义一个新的类TwoBytes。我们添加了一些功能,以便可以从任何istream读取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;
}

我希望这会有所帮助。 。