Я думаю, что обычно было бы использовать какую-то ручку.Затем, когда вы захотите получить доступ к объекту, вы передадите дескриптор функции, которая загрузит память и даст вам адрес, а затем закроете дескриптор.В C ++ вы должны использовать RAII.
#include <string>
#include <cstdio>
template <class T>
class Access
{
private:
FILE* f= nullptr;
public:
Access(const std::string& filename)
{
f= fopen(filename.data(), "rw");
}
~Access()
{
fclose(f);
}
class WriteAccess
{
T buffer{};
bool dirty= false;
FILE* f;
int64_t elementNumber;
public:
WriteAccess(FILE* f, int64_t elementNumber)
: f(f)
, elementNumber(elementNumber)
{
if (f) {
fseek(f, elementNumber*sizeof(buffer), SEEK_SET);
fread(&buffer, sizeof(buffer), 1, f);
}
}
T& get() { dirty= true; return buffer; }
const T& get() const { return buffer; }
~WriteAccess()
{
if (dirty && f) {
fseek(f, elementNumber*sizeof(buffer), SEEK_SET);
fwrite(&buffer, sizeof(buffer), 1, f);
}
}
};
WriteAccess operator[] (int64_t elementNumber)
{
return WriteAccess(f, elementNumber);
}
};
struct SomeData
{
int a= 0;
int b= 0;
int c= 0;
};
int main()
{
Access<SomeData> myfile("thedata.bin");
myfile[0].get().a= 1;
auto pos1= myfile[1];
pos1.get().a= 10;
pos1.get().b= 10;
}
Конечно, вы предоставляете доступ для чтения и доступ для записи, вероятно, не используя fopen, а новые файлы c ++, , вы должны проверять ошибки , иможет быть, вы могли бы избавиться от функции get()
в виде оператора преобразования в T
.
Также следует заметить, что вы можете использовать подсчет ссылок, в моем простом примере класс Access
должен выжить WriteAccess
class.
Кроме того, вы должны заблокировать, если это будет использоваться более чем одним потоком, и я предположил, что вы не получите доступ к одному и тому же элементу дважды.
Или вы могли бытакже используйте доступ к файлам, отображенным в памяти, как они сказали вам.