从二进制文件中读取数据

时间:2011-02-02 11:55:32

标签: c++ memory binary-data

我正在尝试从二进制文件中读取数据,并遇到问题。我把它简化为这里最简单的情况,它仍然无法正常工作。我是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中设置断点以进行调试

提前致谢。

6 个答案:

答案 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);
}