为什么 ofstream::rdbuf() 总是为空

Why ofstream::rdbuf() is always empty?

本文关键字:ofstream rdbuf 为什么      更新时间:2023-10-16
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)