ofstream ofs1("file1.dat", ios::out | ios::binary);
unsigned char data[64] = {0};
ofs1.write((char*) &data, sizeof(data));
if (some_condition)
{
ofstream ofs2("file2.dat", ios::out | ios::binary);
ofs2 << ofs1.rdbuf();// This does not work.
}
unsigned char more_data[32] = {1};
ofs1.write((char*) &more_data, sizeof(more_data));
As expected, file1.dat is 96 bytes in size after executing the code. However, file2.dat is 0 bytes, where I would expect it to be 64 bytes. Apparently ofstream::rdbuf()
is always empty, or is it not supposed to be used like this?
Practical use for this: an application that writes several files using the same header (e.g. a colour palette). In this code example the contents of data
(colour palette) are static, but it can obviously be replaced by a more complex computation, which would be overkill to repeat for each output file...
Your issue is that an ofstream
by default opens its buffer in output mode only, and either way you're only passing std::ios_base::out
, which means the buffer cannot be read from.
To fix this you will need to switch to using an fstream
and open it with std::ios_base::in | std::ios_base::out | std::ios_base::binary
.
You will also need to seek to the start of the file before calling rdbuf
by calling seekg(0, std::ios_base::beg)
.