将二进制数据写入文件

时间:2011-10-01 19:01:52

标签: c++ io ostream

我想在将二进制数据写入文件之前临时缓存它。这是我的想法。

由于我必须在此数据之前插入一个标题,指示标题后将跟随多少数据,因此我需要一种方法在将数据写入ofstream file之前保持这些数据的缓存。我决定创建ostream buffer();,其中我可以转储所有这些数据而不将其写入文件。

写入标题后,我只是file << buffer转储数据。

我仍然在努力解决编译器错误,例如:

error: no matching function for call to ‘TGA2Converter::writePixel(std::ostream (&)(), uint32_t&)’
note: candidate is: void TGA2Converter::writePixel(std::ostream&, uint32_t)

为什么我收到此消息?而且,或许更重要的是,我是否以最有效和最方便的方式解决问题?


编辑:人们一直在询问代码。我试图将其缩小到这个......

// This is a file. I do not want to write the binary
// data to the file before I can write the header.
ofstream file("test.txt", ios::binary);

// This is binary data. Each entry represents a byte.
// I want to write it to a temporary cache. In my
// real code, this data has to be gathered before
// I can write the header because its contents depend
// on the nature of the data.
stringstream cache;
vector<uint32_t> arbitraryBinData;
arbitraryBinData.resize(3);
arbitraryBinData[0] = 0x00;
arbitraryBinData[1] = 0xef;
arbitraryBinData[2] = 0x08;

// Write it to temporary cache
for (unsigned i = 0; i < arbitraryBinData.size(); ++i)
    cache << arbitraryBinData[i];

// Write header
uint32_t header = 0x80;     // Calculation based on the data!
file << header;

// Write data from cache
file << cache;

我完全希望将这个二进制数据写入文件:

0000000: 8000 ef08

但我得到了这个:

0000000: 3132 3830 7837 6666 6638 6434 3764 3139
0000010: 38

为什么我没有得到预期的结果?

1 个答案:

答案 0 :(得分:3)

ostream buffer();声明一个名为buffer的函数,它不带参数并返回ostream。此外ostream是基类,您应该使用strstream代替。