2015-12-13 139 views
0
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()总是空的,还是不应该这样使用?为什么ofstream :: rdbuf()总是空的?

实际用途:使用相同标题(例如调色板)写入多个文件的应用程序。在这个代码示例中,data(调色板)的内容是静态的,但它显然可以被更复杂的计算所取代,这对于每个输出文件都是重复过度的。

+2

'这不行。'它是'ofstream',底层缓冲区无法读取。 – user657267

+0

但是,在刷新缓冲区内容之前,必须有一些方法来复制缓冲区内容? – Midas

+0

@Midas:它不打算从中读取。仅仅存在缓冲区和知识的内容就是不应该暴露的实现细节。您可以编写自己的包装缓冲区,以记录发送给它的信息。 –

回答

2

您的问题是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)以寻求文件的开始。