Я столкнулся с проблемой при использовании библиотеки boost из mapped_file iostreams.
форсированная документация: mapped_file
После прочтения всей документации и примеров, которые я мог прочитать, я все еще не могу заставить работать следующий фрагмент кода. Я предполагаю, что когда вы передаете new_file_size и путь к классу mapped_file_params, он затем откроет (и создаст) файл в нужном месте, когда я вызову конструктор mapped_file с объектом mapped_file_params в параметре.
Но единственное, что он делает, — это создает файл со странным именем, например, «% F8 / 134», в рабочем каталоге проекта, а не там, где я это сказал.
Может быть, я не прав, и нужно создать файл, прежде чем указывать его в mapped_file? После прочтения документа я предположил, что он создал новый файл при заполнении параметра new_file_size. и указывает имя файла.
Кто-нибудь испытывал это раньше? Любой совет, как решить эту проблему?
Вот код:
boost::iostreams::mapped_file_params param(filename); // filename is a std::string with the correct path
param.flags = boost::iostreams::mapped_file::mapmode::readwrite;
param.new_file_size = sizeNeeded; // sizeNeeded is the size of the data
param.length = sizeNeeded;
boost::iostreams::mapped_file fileMap(param); // at this point the file is created
…
Спасибо за ваше время,
Александр
Во-первых, я не уверен, насколько хорошо mapmode :: ReadWrite поддерживается и насколько хорошо поддерживается библиотека boost :: iostream. Для любопытства я попробовал ваш слегка «модифицированный» код с boost 1.52 на Ubuntu 12.04, скомпилированный с g ++ — 4.7.2. Я не видел проблему со «странным именем». Файл был создан с правильным именем, но mf.open (param) не закончил для повышенного исключения на ММАП в файле: mapped_file.cpp
void* data =
::BOOST_IOSTREAMS_FD_MMAP(
const_cast<char*>(p.hint),
size_,
readonly ? PROT_READ : (PROT_READ | PROT_WRITE),
priv ? MAP_PRIVATE : MAP_SHARED,
handle_,
p.offset );
if (data == MAP_FAILED)
cleanup_and_throw("failed mapping file");
Если вы можете перейти на более новую версию, я бы сделал это. Кроме того, вы можете собрать библиотеку boost в режиме отладки и отслеживать код, чтобы увидеть, что не так. Здесь вы можете найти несколько советов по созданию расширенных библиотек в режим отладки
Других решений пока нет …