我的目标是从二进制文件中读取数据并最终将这些位存储在32位片中。我发现了一些在C ++中读取二进制文件的不同方法,但我不确定哪个是最佳选项,我的主要问题是在存储数据后输出数据时我不是访问单个位而是显示ASCII字符。
int main(int argc, const char *argv[])
{
std::vector<char> memblock;
int i=0;
::std::ifstream in(argv[1], ::std::ios::binary);
while (in) {
char c;
in.get(c);
if (in) {
memblock.push_back(int(c));
i++;
//::std::cout << "Read a " << int(c) << "\n";
}
}
std::cout << "The contents of memblock are:";
for (std::vector<char>::iterator it = memblock.begin(); it != memblock.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
还有:
streampos size;
char * memblock;
ifstream file ("path", ios::in|ios::binary|ios::ate);
if (file.is_open())
{
size = file.tellg();
memblock = new char [size];
file.seekg (0, ios::beg);
file.read (memblock, size);
file.close();
cout << "the entire file content is in memory";
for(int i =0; i<10; i++){
cout << memblock[i+2000];
}
}
每种方法都有优势吗?还是有更好的方法?另外,我如何确保存储二进制文件中的实际位值或二进制数据?谢谢
答案 0 :(得分:2)
您想要读取32位整数,而不是char
:
uint32_t * memblock;
ifstream file ("path", ios::in|ios::binary|ios::ate);
if (file.is_open())
{
size = file.tellg();
memblock = new unit32_t [size / 4 + (size % 4 == 0 ? 0 : 1)];
file.seekg (0, ios::beg);
file.read (reinterpret_cast<char*>(memblock), size);
file.close();
cout << "the entire file content is in memory";
for(int i =0; i<size/4; i++){
cout << memblock[i];
}
}
答案 1 :(得分:1)
您 正在阅读实际的二进制内容。通过cout
打印它会产生ascii字符,因为cout
用于在传递char
值时打印字符串,除非另有说明。此外,如果要将其存储在32位切片中,则不应使用char
,而应使用32位数据类型。试试uint32_t
。不要忘记调整大小,因为文件大小以字节为单位,但uint32_t
有四个字节。
为了测试N
位(N
从0开始)是否在某个整数变量中设置,您可以定义以下宏:
#define IS_BIT_SET(v, N) ( (v) & ( 1<<(N) ) )
bool bit12Set = IS_BIT_SET(v, 12);
如果您需要更多舒适,请使用std::bitset
。