2015-10-16 4 views
0

В моем коде на 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)"

Любая помощь ценят.

Благодаря

+0

Я вижу причины ошибки ваши крышки блокировки ключ вести себя так, как будто он застрял в «активном» состоянии? – sehe

ответ

1

Исключение Объем для файла не был изменен извне, так что открыл файл больше не действует.

Настоятельно предлагает, чтобы файл был изменен другой программой, в то время как он был отображен. И сообщение об ошибке указывает, что произошедшее изменение повлияло на размер таким образом, который не разрешен.

Избегайте других программ записи в файл, или надлежащей синхронизации и совместного использования мер предосторожности (например, не меняют размер, или только расти и т.д.)

UPDATE

Ваш Добавленные SSCCE подтверждает что вы открыли файл во время отображения:

Перед картированием необходимо закрыть . Кроме того, вам необходимо удалить отображение, прежде чем разрешить его удаление.

Работа образца:

Live On Coliru

#include <iostream> 
#include <fstream> 
#include <boost/interprocess/file_mapping.hpp> 
#include <boost/interprocess/mapped_region.hpp> 

int main() { 
    using namespace boost::interprocess; 

    const char *fileName = "test.bin"; 
    const std::size_t fileSize = 10000; 

    std::cout << "create file " << fileName << 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); 
    } 
} 
+0

Привет, других процессов, использующих этот файл, нет. Файл создается в примере ... –

+0

Добавили ли вы этот файл в свой проект VS? Кто дает ошибку? Как это выглядит на экране? – sehe

+0

Файл создается самим кодом. Я также разместил код ... –