Другие языки программирования и технологии

Запись объекта класса в файл и его чтение

В C++ есть ifstream и ofstream, через которые можно записывать и читать целые объекты. Возможно ли подобное реализовать через FILE из С ? (Не каждое поле отдельно, а весь объект сразу)
Можно реализовать через запись данных в двоичном виде. Можно записать всю структуру целиком.

НО! Нужно учитывать следующее:
1) поля в структурах лежат в памяти не подряд, а с так называемым выравниванием (этот термин легко гуглится). В зависимости от архитектуры, под которую компилируете, а так же от компилятора, размер выравнивания может отличаться.
2) типы данных имеют разные длины в байтах для разных архитектур и компиляторов.

Соответственно, если читать и писать такие файлы с объектами программами, скомпилированными разными компиляторами или под разные архитектуры, то возможно, что работать будет некорректно.

Но если все это будет в рамках одной скомпилированной программы, то так можно делать. Код с примером ниже.

#include (stdio.h) //mailru не дает подключать заголовок треугольными скобками

typedef struct {
int a;
float b;
} OBJECT;

int main()
{
FILE* f = fopen("file.bin", "wb");

OBJECT o;
o.a = 10;
o.b = 3.14;

//Получить указатель на объект
char* dataPtr = (char*) &o;

//Записать объект в файл в двоичном виде
fwrite(dataPtr, sizeof(o), 1, f);

//dataPtr - указатель на область памяти, где лежит наша структура
//и откуда начинать писать байты в файл
//sizeof(o) - размер объекта в байтах
//1 - количество объектов, которое надо записать
//а - дескриптор файла, куда пишем

fclose(f);

f = fopen("file.bin", "rb");

OBJECT o1;

//Получаем указатель на читаемый объект
dataPtr = (char*) &o1;

//Читаем объект из файла, аргументы аналогичны fwrite
fread(dataPtr, sizeof(o1), 1, f);

printf("%d %f", o1.a, o1.b);

fclose(f);
}
ВБ
Владимир Борисов
262
Лучший ответ