Другие языки программирования и технологии
Запись объекта класса в файл и его чтение
В 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);
}
НО! Нужно учитывать следующее:
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);
}
Похожие вопросы
- С++, объект класса, экземпляр класса, какой тип переменной хранит экземпляр класса? (экземпляр это что? Word, lpstr..?)
- Классы и файлы
- Borland C. Чтение файла с помощью прерываний
- Экземпляра класса, объекты
- Командный файл, который выводит список файлов, находящихся в домашнем каталоге пользователя и недоступных ему по чтению.
- Запись в файл структуры данных. С++
- Проблема с записью в файл в делфи
- Вопрос по дробления программы на файлы и классам. На данных условиях, как будет выглядеть структуризация?
- .bat файл изменение записей реестра
- Как вы называете файлы / модули / классы, которые читают / сохраняют данные на диск?