我正在尝试从二进制文件中读取数据,并遇到问题。我把它简化为这里最简单的情况,它仍然无法正常工作。我是c ++的新手,所以我可能会做些傻事,但是,如果有人可以建议我会非常感激。
代码:
int main(int argc,char *argv[]) {
ifstream myfile;
vector<bool> encoded2;
cout << encoded2 << "\n"<< "\n" ;
myfile.open(argv[2], ios::in | ios::binary |ios::ate );
myfile.seekg(0,ios::beg);
myfile.read((char*)&encoded2, 1 );
myfile.close();
cout << encoded2 << "\n"<< "\n" ;
}
输出
00000000
000000000000000000000000000011110000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Compression_Program(58221)malloc: *对象0x10012d的错误:未对齐的指针被释放 * 在malloc_error_break中设置断点以进行调试
提前致谢。
答案 0 :(得分:4)
不要将vector<bool>*
投射到char*
。它没有做任何可预测的事情。
答案 1 :(得分:1)
这里有两个错误:
vector<bool>
将一个向量转换为char *
并不是一件好事,因为向量是一个对象,并存储一些状态及其元素。
这里你可能覆盖了向量的状态,因此析构函数失败了。
也许你想要转换向量的元素(保证在内存中连续存储)。但另一个陷阱是vector<bool>
可能是实现优化的。
因此,您应该encoded2.reserve(8)
并使用myfile.read(reinterpret_cast<char *>(&encoded2[0]))
。
但是你可能想做别的事情,我们需要知道这里的目的是什么。
答案 2 :(得分:1)
您正在阅读已编码的2:myfile.read((char*)&encoded2, 1 );
。这是错的。你可以读一个bool,然后把它放在编码2
bool x;
myfile.read( &x, 1 );
encoded2[0] = x;
答案 3 :(得分:1)
你正在覆盖std::vector
,你不应该这样做。 std::vector
实际上是指向数据数组的指针和一个保持其大小的整数(可能是size_t
);如果用几乎随机的位覆盖这些,就会发生数据损坏。
由于您只读取一个字节,这就足够了:
char c;
myfile.read(&c, 1);
答案 4 :(得分:1)
C ++语言没有提供一种有效的I / O方法来将位读取为位。你必须读取组中的位。此外,在读取位时,您必须担心Endianess。
我建议使用老式的方法来分配缓冲区,读入缓冲区然后在缓冲区上运行。
const unsigned int BUFFER_SIZE = 1024 * 1024; // Let the compiler calculate it.
//...
unsigned char * const buffer = new unsigned char [BUFFER_SIZE]; // The pointer is constant.
unsigned int bytes_read = 0;
ifstream data_file("myfile.bin", ios::binary); // Open file for input without translations.
data_file.read(buffer, BUFFER_SIZE); // Read data into the buffer.
bytes_read = data_file.gcount(); // Get actual count of bytes read.
delete
你的缓冲区
完成它。答案 5 :(得分:0)
myfile.read((char*) &encoded2[0], sizeof(int)* COUNT);
或者您可以使用push_back();
int tmp;
for(int i = 0; i < COUNT; i++) {
myfile.read((char*) &tmp, 4);
encoded2.push_back(tmp);
}