我想用boost::iostreams::mapped_file_sink
来编写记录器。
我首先创建一个4KB的mapped_file;当文件已满并且程序正在尝试写入4K + 1字节时,我会放大mapped_file_param的大小,重新打开“相同文件”,但设置mapped_param.offset = 4KB。然后我写入.data()返回的内存。
现在的问题是,当我想将4K + 1字节数据附加到4K + 1位置的文件时,文件的先前4KB数据将被删除!我只有文件中的(4K + 1)^个数据!
任何人都可以帮助我吗?
[更新]:以下是我的计划:
void read_write_unidirection_example()
{
boost::iostreams::mapped_file_sink file_sink;
boost::iostreams::mapped_file_params param_sink;
int offset = 0;
int page;
bool restart = true;
param_sink.path = "result.log";
param_sink.offset = 0;
param_sink.new_file_size = file_sink.alignment(); /*This has to be the size of bytes to write!*/
file_sink.open(param_sink);
std::cout<<param_sink.new_file_size<<std::endl;
if( ! file_sink.is_open())
return;
for(int i=0; i<4000; i++)
{
std::stringstream ss;
ss<<"LOG ********"<<i<<"-"<<offset<<"*********\n";
int slen = strlen(ss.str().c_str());
// std::cout<<i<<" "<<offset<<"+"<<slen<<"="<<offset+slen<<" "<<(offset + slen > param_sink.new_file_size)<<"|";
if(offset + slen > file_sink.alignment())
{
std::cout<<"Exceed memory limit @"<<i<<" "<<offset<<"+"<<slen<<std::endl;
file_sink.close();
page += 1;
offset = 0;
param_sink.offset = param_sink.new_file_size;
param_sink.new_file_size += file_sink.alignment();
std::cout<<"file.offset: "<<param_sink.offset<<" file.size: "<<param_sink.new_file_size<<std::endl;
file_sink.open(param_sink);
if(!file_sink.is_open()) return;
std::cout<<"new mapped_file created!"<<std::endl;
restart = true;
}
char * pointer= file_sink.data()+offset;
if(restart)
{
std::cout<<(void*)file_sink.data()<<"+"<<offset<<" = "<<(void*)pointer<<std::endl;
}
memcpy(pointer, ss.str().c_str(), slen);
if(restart){
std::cout<<"hehe"<<std::endl;
restart = false;
}
offset += slen;
}
file_sink.close();
}
每次重新打开此文件时,我都想附加到result.log文件。 result.log应该作为日志文件提供。