当文件不够大时,boost mapped_file_sink会附加到文件的末尾

时间:2014-02-18 02:39:19

标签: c++ boost

我想用boost::iostreams::mapped_file_sink来编写记录器。

我首先创建一个4KB的mapped_file;当文件已满并且程序正在尝试写入4K + 1字节时,我会放大mapped_file_param的大小,重新打开“相同文件”,但设置mapped_pa​​ram.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应该作为日志文件提供。

0 个答案:

没有答案