Как сделать класс, объекты которого лежат на диске.
От: zorky10  
Дата: 30.04.11 14:36
Оценка:
Мне надо создать универсальный класс для работы с данными которые лежат не в памяти, а в другом пространстве, допустим на диске. Имеются функции чтения и записи данных. Надо создать такой шаблон, чтобы при работе с объектами которые произошли от этого класса программа не отличалась от работы с обычными переменными. Мне удалось сделать какую-то заготовку, но там работает только запись на диск, а вот чтение не понимаю как сделать. Если такое возможно сделать, то неплохо бы ещё добавить операторов — взятие адреса в пространстве диска, работа с массивами.



#include <windows.h>
#include <stdlib.h>
#include <stdio.h>


class SPACE
{  private:
   HANDLE hFile;  
   public:
   SPACE (char * fname)
   {  hFile=CreateFile(fname,   
            GENERIC_WRITE | GENERIC_READ ,           
            FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,      
                          NULL,                      
                          OPEN_ALWAYS,               //  
                          FILE_ATTRIBUTE_NORMAL,     // normal file 
                          NULL);    
   };
   
   ~SPACE(void)
   {  CloseHandle(hFile);
   };
   
   virtual
   DWORD Write(DWORD space_pos, DWORD size, void *var)
   {  printf("Write");
       DWORD _res,_nBytes, _Pos;
       _res=SetFilePointer(hFile,space_pos,  NULL,  FILE_BEGIN);
       WriteFile(hFile,  (void*)&(var), size, &_nBytes,  NULL);
       return  _nBytes;
   };
   
   virtual
   DWORD Read(DWORD space_pos, DWORD size, void *var)
   {   printf("Read");
       DWORD _res,_nBytes, _Pos;
       _res=SetFilePointer(hFile,space_pos,  NULL,  FILE_BEGIN);
       ReadFile(hFile,  (void*)&(var), size, &_nBytes,  NULL);
       return  _nBytes;
   };
};



template  <class Type>
class SHAREDOBJECT 
{  size_t address;
   SPACE *pSpace;
   
public:
   
   SHAREDOBJECT(SPACE &S,  size_t pos)
   { address=pos;
     pSpace=&S;
     printf("SHAREDOBJECT size=%d\n", sizeof(Type));
   } 
   

   Type operator= (Type obj)
   { pSpace->Write(address, sizeof(Type), &obj);      
     return obj;
   }
};


typedef struct 
{ int x, y, z;
} COORD3;


void test()
{   SPACE S("file.dat");                                         //заводим пространство для переменных
    SHAREDOBJECT<COORD3> Obj1(S, 0), Obj2(S, sizeof(COORD3));   //размещаем там две переменные типа COORD3
    COORD3 a={1,2,3},b;                                        //заводим переменную в памяти      
    Obj1=a;                                         // память->диск,  это работает    
    //b=Obj1;                                       //диск->память, это не работает
    //Obj2=Obj1;                                    //диск->диск, это не работает
    //printf("Obj2=%d:%d:%d  sizeof(Obj2)=%d\n", Obj2.x, Obj2.y, Obj2.z, sizeof(Obj2));
}
Re: boost::interprocess Managed Mapped File
От: любой  
Дата: 30.04.11 15:23
Оценка:
художников никогда не обижал
Re[2]: boost::interprocess Managed Mapped File
От: Pavel Dvorkin Россия  
Дата: 01.05.11 05:00
Оценка: +1
Здравствуйте, любой, Вы писали:

Или просто CreateFileMapping — MapViewOfFile, если автор хочет ограничиться Win API и не привлекать boost
With best regards
Pavel Dvorkin
Re[3]: boost::interprocess Managed Mapped File
От: любой  
Дата: 01.05.11 05:14
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Или просто CreateFileMapping — MapViewOfFile, если автор хочет ограничиться Win API и не привлекать boost


Я не о просто Mapped File, а о managed. Который уже с аллокатором и key-value индексом.
художников никогда не обижал
Re[4]: boost::interprocess Managed Mapped File
От: Pavel Dvorkin Россия  
Дата: 01.05.11 12:20
Оценка:
Здравствуйте, любой, Вы писали:

PD>>Или просто CreateFileMapping — MapViewOfFile, если автор хочет ограничиться Win API и не привлекать boost


Л>Я не о просто Mapped File, а о managed. Который уже с аллокатором и key-value индексом.


А я о том, что ТС пытался сделать это на чистом Win API, ну вот я ему и написал, как на API делать. Пусть выбирает
With best regards
Pavel Dvorkin
Re: Как сделать класс, объекты которого лежат на диске.
От: c-smile Канада http://terrainformatica.com
Дата: 01.05.11 18:10
Оценка:
Здравствуйте, zorky10, Вы писали:

Z>Мне надо создать универсальный класс для работы с данными которые лежат не в памяти, а в другом пространстве, допустим на диске.


В качестве идеи:
http://www.codeproject.com/KB/cpp/flattables.aspx
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.