我是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;
}
}
我对自己的方法有疑问,我仍在学习。如果您能指导我寻求更好的解决方案,那将是有帮助的。谢谢。
答案 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;
}
我希望这会有所帮助。 。