Прочитать объект из файла прямо в его методе C++
Мне нужно записать записывать/считывать объект из файла, используя функции fwrite() и fread(). Могу ли я создать такие методы в классе:
class Foo
{
public:
void saveToFile(const char *filename) const
{
FILE *file = fopen(filename, "wb");
//Функция fwrite() не модифицирует данные,
//на которые указывать this. Все должно быть хорошо.
fwrite(this, sizeof(*this), 1, file);
fclose(file);
}
void loadFromFile(const char *filename)
{
FILE *file = fopen(filename, "rb");
//Функция fread() модифицирует данные,
//на которые указывает this.
//Это происходит прямо в методе класса,
//который сейчас будет читаться из файла.
//Безопасно ли это делать?
fread(this, sizeof(*this), 1, file);
fclose(file);
}
};
И рассчитывать, что все будет работать хорошо? В коде могут быть упущены и другие моменты, но меня интересует только чтение в память по указателю this прямо в методе класса. Можно ли так делать?
Ответы (1 шт):
В пределах одной машины проблем быть не должно для POD структур. Но при передаче на другие могут возникнуть две проблемы: может различаться выравнивание полей и порядок байт. Первая проблема решается перебором элементарных полей и вызовом функции сериализации/десериализации для каждого. Вторая решается переносимой реализацией этих функций сериализации/десериализации. К сожалению, в С++ нет стандартных средств управления порядком байт, но можно использовать функции операционной системы типа htonll . Нормального способа обойти все элементарный поля тоже нет. Рекомендую гуглить c++ serialization