【发布时间】:2018-09-13 23:02:34
【问题描述】:
我需要创建并写入内存映射文件。有时需要增大文件。
我创建了以下小测试,我创建了一个文件,使用boost::mapped_region 映射它并写入它。
这一切都按预期工作:
#include <fstream>
#include <boost/interprocess/file_mapping.hpp>
#include <boost/interprocess/mapped_region.hpp>
namespace bip = boost::interprocess;
void createFile(const char* fn, std::uint64_t num)
{
std::filebuf fbuf;
fbuf.open(fn, std::ios_base::out|std::ios_base::binary|std::ios_base::trunc);
const std::uint64_t size = sizeof(std::uint64_t) * (num + 1);
fbuf.pubseekoff(size - 1, std::ios_base::beg);
fbuf.sputc(0);
fbuf.close();
}
void writeToFile(const char* fn, std::uint64_t pos, std::uint64_t val)
{
bip::file_mapping fm(fn, bip::read_write);
bip::mapped_region rg(fm, bip::read_write);
std::uint64_t* p = reinterpret_cast<std::uint64_t*>(rg.get_address());
*p = std::max(*p, pos); // store max num values
*(p + pos) = val; // write value into position
}
int main ()
{
const char* fn = "/tmp/test.dat";
createFile(fn, 3);
writeToFile(fn, 1, 0x1111111111111111);
writeToFile(fn, 2, 0x2222222222222222);
writeToFile(fn, 3, 0x3333333333333333);
return 0;
}
运行该程序会按预期生成一个输出文件,当我转储其内容时,我可以看到其中正确写入的值:
$ xxd -p /tmp/test.dat
030000000000000011111111111111112222222222222222333333333333
3333
不过,现在我想调整文件的大小,以便在最后写入更多数据。
我添加了以下函数,growFile(它使用ios_base::app,如下面的timrau 建议的那样)
void growFile(const char* fn, std::uint64_t num)
{
std::filebuf fbuf;
fbuf.open(fn, std::ios_base::out|std::ios_base::binary|std::ios_base::app);
const std::uint64_t size = sizeof(std::uint64_t) * (num + 1);
fbuf.pubseekoff(size - 1, std::ios_base::beg);
fbuf.sputc(0);
fbuf.close();
}
我现在在增大文件后添加更多值:
int main ()
{
const char* fn = "/tmp/test.dat";
createFile(fn, 3);
writeToFile(fn, 1, 0x1111111111111111);
writeToFile(fn, 2, 0x2222222222222222);
writeToFile(fn, 3, 0x3333333333333333);
growFile(fn, 6);
writeToFile(fn, 4, 0x4444444444444444);
writeToFile(fn, 5, 0x5555555555555555);
writeToFile(fn, 6, 0x6666666666666666);
return 0;
}
当我转储文件时,它缺少大部分新值。
$ xxd -p /tmp/test.dat
060000000000000011111111111111112222222222222222333333333333
333344
请注意,如果我不增加文件,而只是在最初创建时有足够的空间,它会按预期工作:
int main ()
{
const char* fn = "/tmp/test.dat";
createFile(fn, 6);
writeToFile(fn, 1, 0x1111111111111111);
writeToFile(fn, 2, 0x2222222222222222);
writeToFile(fn, 3, 0x3333333333333333);
writeToFile(fn, 4, 0x4444444444444444);
writeToFile(fn, 5, 0x5555555555555555);
writeToFile(fn, 6, 0x6666666666666666);
return 0;
}
当我转储文件时,所有值都在那里:
$ xxd -p /tmp/test.dat
060000000000000011111111111111112222222222222222333333333333
3333444444444444444455555555555555556666666666666666
如何在创建文件后增加文件的大小,以便可以进一步写入其初始大小?
【问题讨论】:
标签: c++ linux file memory-mapped-files