C++ - 将二进制文件的一部分读入到位集中

4

我有一个 C++ 应用程序,在其中需要读取二进制文件的某一部分,并将这些字节放入 std::bitset 中。

虽然我能够将正确的文件部分读入 std::string 对象,但如果可以避免的话,我不想使用 unsigned char->std::string->std::bitset 的方法。

有没有直接将文件的一部分读入 bitset 的方法?

到目前为止,我已经有了以下代码(在此示例中,我从位置 64 开始,然后将 128 个字节读入一个 string,最后初始化了一个 bitset):

//Open the file
std::ifstream file (path, std::ios::in | std::ios::binary | std::ios::ate);

//Move to the position to start reading
file.seekg(64); 

//Read 128 bytes of the file
std::vector<unsigned char> mDataBuffer;
mDataBuffer.resize( 128 ) ;
file.read( (char*)( &mDataBuffer[0]), 128 ) ;

//Read as string (I'm trying to avoid this)
std::string s_data( mDataBuffer.begin(), mDataBuffer.end()); 
std::bitset<1024> foo (s_data); //8 bits/byte x 128 bytes = 1024 bits

file.close()

2
当您立即寻求绝对位置时,为什么要使用std::ios::ate标志?此外,对于输入流使用ate标志并没有太多意义,因为如果您不从末尾寻找,就没有可读取的内容。 - Some programmer dude
真是太遗憾了,但我在参考资料中找不到任何允许那样做的东西。 - Bartek Banachewicz
@JoachimPileborg 在更大的图景中,这段代码在一个循环内部,我在其中移动文件。话虽如此,我从某个地方抓取了ios:ate,所以它很可能被错误使用(我不太确定如何使用它)。 - Brett
1个回答

0

根据我阅读的位集合<>文档,字符串应该只包含'1'和'0'。所以在您的情况下,只需迭代mDataBuffer中的所有位并使用set在位集中设置一个位。

当然,如果需要访问少量位,则可以坚持使用vector< unsigned char >并提取位。这是有意义的。


我认为他想要避免在这里进行O(n_of_bits)操作。 - Bartek Banachewicz
当然,我们都希望避免它,但答案是:这是不可能的 :-) - Torsten Robitzki
同意,我想要避免它。但如果不可能的话,那就是答案。鉴于我根本不是C++方面的专家,因此我寻求SO的建议。 :-) - Brett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接