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

C++ C++;-将二进制文件的一部分读入位集中,c++,file,C++,File,我有一个C++应用程序,需要读取二进制文件的一部分,然后将这些字节放入std::bitset 我能够将二进制文件的正确部分读入std::string对象,但如果可以避免,我不想从unsigned char->std::string->std::bitset 有没有办法将文件的一部分直接读入位集中? 到目前为止,我已经有了代码(在本例中,我从位置64开始,然后将128字节读入字符串,然后初始化位集): //打开文件 std::ifstream文件(路径,std::ios::in | std::io

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

我能够将二进制文件的正确部分读入
std::string
对象,但如果可以避免,我不想从
unsigned char->std::string->std::bitset

有没有办法将文件的一部分直接读入位集中?

到目前为止,我已经有了代码(在本例中,我从位置64开始,然后将128字节读入
字符串
,然后初始化
位集
):

//打开文件
std::ifstream文件(路径,std::ios::in | std::ios::binary | std::ios::ate);
//移动到开始读取的位置
文件.seekg(64);
//读取文件的128字节
std::向量mDataBuffer;
mDataBuffer.resize(128);
read((char*)(&mDataBuffer[0]),128);
//读取为字符串(我试图避免这种情况)
字符串s_数据(mDataBuffer.begin(),mDataBuffer.end());
std::位集foo(s_数据)//8位/字节x 128字节=1024位
file.close()文件

当我阅读位集文档时,字符串应该只包含“1”和“0”。因此,在您的情况下,只需迭代mDataBuffer中的所有位,并使用set在位集中设置一个位


当然,如果需要的话,您可以使用
向量
并将位取出。如果您只需要访问一些位,这是有道理的。

当您立即搜索到绝对位置时,为什么要使用
std::ios::ate
标志?另外,在输入流中使用
ate
标志并没有多大意义,因为如果你不从末尾开始寻找,就没有什么可读的。这真是太遗憾了,但我在引用中找不到任何允许这样做的东西。@JoachimPileborg在大图中,这段代码在一个循环中,我确实在文件中移动。也就是说,我从某处的一个例子中抓取了
ios:ate
,这样它就很可能被错误地使用(我不确定如何使用)。我想他想避免这里的O(n_位的n_)操作。当然,我们都想避免它,但答案是:这是不可能的:-)同意,我想避免它。但如果不可能,那就是答案。鉴于我不是C++专家,至少我是这样寻求建议的。
//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()