В моем коде на C++ мне нужно записать много данных в файл, и я бы хотел использовать файл с перенаправлением вместо обычного файла. Только когда я закончу запись всех данных в памяти, я хотел бы сбросить сопоставленный файл на диск одним выстрелом.Проблемы с отображением памяти, отображаемые в памяти
Я использую Visual Studio 2010 на Windows Server 2008 R2 и увеличиваю 1.58.
Я никогда не использовал отображенный файл, поэтому я попытался скомпилировать пример на повышающего документации
#include <iostream>
#include <fstream>
#include <boost/interprocess/file_mapping.hpp>
#include <boost/interprocess/mapped_region.hpp>
int main(int argc, char** argv)
{
using namespace boost::interprocess;
const char* fileName = "C:\\logAcq\\test.bin";
const std::size_t fileSize = 10000;
std::cout << "create file" << std::endl;
try
{
file_mapping::remove(fileName);
std::filebuf fbuf;
fbuf.open(fileName, std::ios_base::in | std::ios_base::out | std::ios_base::trunc | std::ios_base::binary);
std::cout << "set size" << std::endl;
fbuf.pubseekoff(fileSize-1, std::ios_base::beg);
fbuf.sputc(0);
std::cout << "remove on exit" << std::endl;
struct file_remove
{
file_remove(const char* fileName)
:fileName_(fileName) {}
~file_remove(){ file_mapping::remove(fileName_); }
const char *fileName_;
}remover(fileName);
std::cout << "create file mapping" << std::endl;
file_mapping m_file(fileName, read_write);
std::cout << "map the whole file" << std::endl;
mapped_region region(m_file, read_write);
std::cout << "get the address" << std::endl;
void* addr = region.get_address();
std::size_t size = region.get_size();
std::cout << "write all memory to 1" << std::endl;
memset(addr, 1, size);
}
catch (interprocess_exception &ex)
{
fprintf(stderr, "Exception %s\n", ex.what());
fflush(stderr);
system("PAUSE");
return 0;
}
system("PAUSE");
return 0;
}
, но я получаю исключение
Exception Объем для файла был изменен извне, так что открытый файл больше недействителен.
когда я создаю этот регион
"mapped_region область (M_FILE, read_write)"
Любая помощь ценят.
Благодаря
Я вижу причины ошибки ваши крышки блокировки ключ вести себя так, как будто он застрял в «активном» состоянии? – sehe