为什么 ofstream::rdbuf() 总是空的?
Why ofstream::rdbuf() is always empty?
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()
总是空的,或者它不应该这样使用?
实际用途:使用相同 header(例如调色板)写入多个文件的应用程序。在这个代码示例中,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)
.
查找文件的开头
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()
总是空的,或者它不应该这样使用?
实际用途:使用相同 header(例如调色板)写入多个文件的应用程序。在这个代码示例中,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)
.