Мне надо создать универсальный класс для работы с данными которые лежат не в памяти, а в другом пространстве, допустим на диске. Имеются функции чтения и записи данных. Надо создать такой шаблон, чтобы при работе с объектами которые произошли от этого класса программа не отличалась от работы с обычными переменными. Мне удалось сделать какую-то заготовку, но там работает только запись на диск, а вот чтение не понимаю как сделать. Если такое возможно сделать, то неплохо бы ещё добавить операторов — взятие адреса в пространстве диска, работа с массивами.
#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));
}
Здравствуйте, любой, Вы писали:
PD>>Или просто CreateFileMapping — MapViewOfFile, если автор хочет ограничиться Win API и не привлекать boost
Л>Я не о просто Mapped File, а о managed. Который уже с аллокатором и key-value индексом.
А я о том, что ТС пытался сделать это на чистом Win API, ну вот я ему и написал, как на API делать. Пусть выбирает
Здравствуйте, zorky10, Вы писали:
Z>Мне надо создать универсальный класс для работы с данными которые лежат не в памяти, а в другом пространстве, допустим на диске.
В качестве идеи:
http://www.codeproject.com/KB/cpp/flattables.aspx