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));


如预期的那样,执行代码后,file1.dat的大小为96字节。但是,file2.dat是0字节,我希望它是64字节。显然ofstream::rdbuf()始终为空,还是不应该这样使用它?

为此的实际用途:使用同一标头(例如调色板)写入多个文件的应用程序。在此代码示例中,data(调色板)的内容是静态的,但显然可以用更复杂的计算代替,这对于每个输出文件重复来说是过大的...

最佳答案

您的问题是,默认情况下,ofstream仅在输出模式下打开其缓冲区,而无论哪种方式,您仅传递std::ios_base::out,这意味着无法从中读取缓冲区。

要解决此问题,您将需要切换到使用fstream并使用std::ios_base::in | std::ios_base::out | std::ios_base::binary打开它。

在通过调用rdbuf调用seekg(0, std::ios_base::beg)之前,还需要查找文件的开头。

关于c++ - 为什么ofstream::rdbuf()始终为空?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34246686/

10-12 21:32