Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
1

Сохранение структуры. Можно ли структуру записать целиком в файл?

24.06.2014, 21:57. Просмотров 1071. Ответов 10
Метки нет (Все метки)

давно интересует такой вопрос: можно ли сразу записать структуру целиком в файл? т.е. fwrite(struct, sizeof(struct), 1, fp)? или если нет еще вопрос можно ли как то обратиться к членам структуры не по именам? ну как то я не знаю по id какому нибудь или что то в этом роде... просто для многих программ часто требуется сохранение структур в бинарник... фактически алгоритм один и тот же везде, вот я и подумал может можно написать какие то общие функции например с использованием шаблонов... только не знаю как обратиться к членам структуры не по имени...
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2014, 21:57
Ответы с готовыми решениями:

Создать структуру из двух полей: целое и строковое. Записать в файл n компонент типа этой структуры.
Создать структуру из двух полей: целое и строковое. Записать в файл n компонент типа этой...

Как записать в переменную данные из структуры, а не адрес на структуру?
Подскажите пожалуйста, есть ли способ записать в переменную *char именно сами данные, а не адрес на...

Запись структуры в файл целиком
Привет! Помогите, записать структуру в файл не по полям, а целиком и поиск. #include <fstream>...

Как записать/считать файл в БД целиком (MS SQL 7.0, ADO 2.5)
Проблемма: Хочу записать Вордовый документ в поле БД на MS SQL. И потом естесственно считать его....

Прочитать весь файл целиком и потом записать что-то новое
Не подскажите, как сделать так , чтобы можно было сначала прочитать весь файл , а потом записать...

10
CarlosCastaneda
9 / 9 / 5
Регистрация: 23.06.2014
Сообщений: 40
24.06.2014, 22:14 2
Можно обратиться по смещению

Добавлено через 3 минуты
C++
1
2
3
4
5
typedef struct 
{
   int id;         // 4-byte int
   char symbol; // 1-byte char
}
в памяти это будет лежать так:
[-- id --] [symbol]
[x][x][x][x] [x],
где [x] - 1 байт памяти,
то есть для того чтобы обратиться к символу, нужно пропустить первые 4 байта
ну это в грубом приближении, там еще padding может вставить компилер и попортить все нахрен
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
24.06.2014, 22:34  [ТС] 3
CarlosCastaneda, ага только откуда функция узнает какие типы данных в структуре... короче я так понимаю моя идея не реализуема походу вообще...
0
CarlosCastaneda
9 / 9 / 5
Регистрация: 23.06.2014
Сообщений: 40
24.06.2014, 23:05 4
Ну блин, это же Си Ваша структура и есть бинарник, просто область в памяти.
0
ValeryS
Модератор
7487 / 5669 / 726
Регистрация: 14.02.2011
Сообщений: 19,381
Завершенные тесты: 1
24.06.2014, 23:09 5
Цитата Сообщение от GetHelp Посмотреть сообщение
ага только откуда функция узнает какие типы данных в структуре...
а ты ей что даешь???
Цитата Сообщение от GetHelp Посмотреть сообщение
fwrite(struct, sizeof(struct), 1, fp)?
также будет с fread
0
aiwprton805
71 / 71 / 50
Регистрация: 30.03.2013
Сообщений: 189
Завершенные тесты: 1
24.06.2014, 23:13 6
Лучший ответ Сообщение было отмечено GetHelp как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
typedef struct{
  char ch;
  int i;
  double r;
} myStruct;
 
int main(int argc, char *argv[])
{
  setlocale(LC_ALL, "RU");
  myStruct st1;
  printf("Введите символ\n");
  fflush(stdin);
  scanf("%c", &st1.ch);
  printf("Введите целое число\n");
  scanf("%d", &st1.i);
  printf("Введите вещественное число\n");
  scanf("%lf", &st1.r);
  FILE *outfile = NULL;
  if((outfile = fopen("myfile.bin", "wb")) == NULL) return 0;
  fwrite(&st1, sizeof(st1), 1, outfile);
  fclose(outfile);
 
  myStruct *st2 = (myStruct *)malloc(sizeof(myStruct));
  FILE *infile = NULL;
  if((infile = fopen("myfile.bin", "rb")) == NULL) return 0;
  fread(st2, sizeof(st1), 1, infile);
  fclose(infile);
  printf("Введённые данные: %c, %d, %lf\n", *((char *)st2), st2->i, st2->r);
  free(st2);
  return 0;
}
Цитата Сообщение от GetHelp Посмотреть сообщение
можно ли сразу записать структуру целиком в файл
можно
Цитата Сообщение от GetHelp Посмотреть сообщение
можно ли как то обратиться к членам структуры не по именам
если поля структуры - разные типы данных, то нельзя
1
ValeryS
Модератор
7487 / 5669 / 726
Регистрация: 14.02.2011
Сообщений: 19,381
Завершенные тесты: 1
24.06.2014, 23:16 7
Цитата Сообщение от aiwprton805 Посмотреть сообщение
если поля структуры - разные типы данных, то нельзя
не то что бы нельзя
просто никто не гарантирует результата
в зависимости от выравнивания, поля могут лежать в разных местах
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
24.06.2014, 23:32  [ТС] 8
Цитата Сообщение от aiwprton805 Посмотреть сообщение
можно
о_О а считать она считается?
0
ValeryS
Модератор
7487 / 5669 / 726
Регистрация: 14.02.2011
Сообщений: 19,381
Завершенные тесты: 1
24.06.2014, 23:37 9
Цитата Сообщение от GetHelp Посмотреть сообщение
о_О а считать она считается?
А тебе что показали???
Цитата Сообщение от aiwprton805 Посмотреть сообщение
fread(st2, sizeof(st1), 1, infile);
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
24.06.2014, 23:43  [ТС] 10
Цитата Сообщение от ValeryS Посмотреть сообщение
А тебе что показали???
а да не заметил, странно я че то всегда по пунктам считывал и думал по другому нельзя... впрочем все равно это не всегда выход, бывает например что в структуре элемент - указатель на массив, соответственно так просто оно не сохранится и не считается, идеально записать в файл перед массивом количество элементов в нем, считать его, выделить память... но в общем это для простых структур будет тоже полезно, спс буду знать...
0
ValeryS
Модератор
7487 / 5669 / 726
Регистрация: 14.02.2011
Сообщений: 19,381
Завершенные тесты: 1
25.06.2014, 00:31 11
Цитата Сообщение от GetHelp Посмотреть сообщение
бывает например что в структуре элемент - указатель на массив,
так бывает и указатель на структуру и много еще на что
тогда приходится создавать свою функцию
но ты хозяин своим данным,как решишь так и будет
0
25.06.2014, 00:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2014, 00:31

Записать в файл F2 информацию о всех кругах файла F1, целиком лежащих в максимальном найденном круге
Создать файл F1, содержащий записи о параметрах заданного числа кругов. Каждая запись файла должна...

Записать в файл F2 информацию о всех кругах файла F1, целиком лежащих в максимальном найденном круге
Создать файл F1, содержащий записи о параметрах заданного числа кругов. Каждая запись файла должна...

Можно ли из интернета скачать часть файла, а не весь файл целиком?
Ребята, помогите! Нужно реализовать закачку части файла с нета (несколько байт), а не весь файл.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru