0 / 0 / 0
Регистрация: 28.03.2022
Сообщений: 16
1

Вывод структуры в бинарный файл

24.04.2022, 16:38. Показов 791. Ответов 8

Author24 — интернет-сервис помощи студентам
Имею программу по вводу и выводу информации. Не понимаю как правильно отписать fwrite, чтобы вся эта красота выводилась в бинарный файл.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <iostream>
 
void menu (int& Menu);
void inputOfStruct (struct vaccination* p,int& size);
void outputOfStruck (struct vaccination* p,int size);
void creatDataFile(struct vaccination* p,int size);
 
struct vaccination // привитые
{
    char FIO [40];
    char nameOfUnit [40];// Adres->подразделение
    int age;//numberOfHistori -> age
    char startOfVaccination [30];// entered -> начало прививки
    int yearOfVaccination;
    char endOfVaccination [30];//discharged->
    char nameOfVaccination [40];// dianosis -> 
    char duty [40];// второй диагноз > должность
};
 
int main ()
{
    setlocale(LC_ALL,"Rus");
    int size,choise;
    vaccination grafted[50];// привитые
    bool exit=false;
    bool chec=false;
    while (!exit)
    {
        menu(choise);
        if (!chec)
        {
            if (choise==1)
            {
                chec=true;
            }
        }
        switch (choise)
        {
            case 1:
                system("cls");
                inputOfStruct (grafted,size);
                break;
            case 2:
                system("cls");
                if (chec)
                {
                    outputOfStruck (grafted,size);
                }
                else
                {
                    printf ("Net dannix");
                    getch();
                }
                break;
            case 3:
                if (chec)
                {
                    system("cls");
                    creatDataFile (grafted,size);
                }
            default: 
                exit=true;
                break;
        }
    }
    getch();
    return(0);
}
 
void menu (int& Menu)
{
    system("cls");
    printf ("1. Ввод данных о привитом\n");
    printf ("2. Список всех привитых\n");
    printf ("3. Создать бинарный файл\n");
    printf ("4. Выход\n");
    scanf ("%d",&Menu);
}
 
void inputOfStruct (struct vaccination* p,int& size)
{
    printf ("Введите кол-во привитых\n");
    scanf ("%d",&size);
    for (int i=0;i<size;i++)
    {
    
        printf ("Введение данных о привитом\n",i+1);
        printf ("Введите ФИО\n");
        fflush(stdin);
        gets (p[i].FIO);
        printf (" Название подразделение\n");
        fflush(stdin);
        gets (p[i].nameOfUnit);
        printf ("Возраст привитого = ");
        scanf ("%d",&p[i].age);
        printf ("Введите дату поступления\n");
        fflush(stdin);
        gets (p[i].startOfVaccination);
        printf ("Введите год, в который прививка была сделана = ");
        scanf ("%d",&p[i].yearOfVaccination);   
        printf ("Введите даты окончания привки\n");
        fflush(stdin);
        gets (p[i].endOfVaccination);
        printf ("Введите название прививки\n");
        fflush(stdin);
        gets (p[i].nameOfVaccination);
        printf ("Введите должность привитого\n");
        fflush(stdin);
        gets (p[i].duty);
    }
}
 
void outputOfStruck (struct vaccination* p,int size)
{
    for (int i=0;i<size;i++)
    {
            printf ("Год прививки:    \t%d\n",p[i].yearOfVaccination);
            printf ("Дата конца прививки:    \t%s\n",p[i].endOfVaccination);
            printf ("Название прививки:        \t%s\n",p[i].nameOfVaccination);
            printf ("Должность:    \t%s\n",p[i].duty);
            printf ("Имя привитого:    \t%s\n",p[i].FIO);
            printf ("Название подразделения:    \t%s\n",p[i].nameOfUnit);
            printf ("Возраст привитого:    \t%d\n",p[i].age);
            printf ("Дата начала прививки:    \t%s\n",p[i].startOfVaccination);
        
        printf ("\n");
    }
    getch();
}
 
void creatDataFile(struct vaccination* p,int size)
{
    FILE *f1;
    char *name;
    puts("Введите имя файла:");
    scanf("%s",name);
    f1 = fopen(name,"wb");
    fwrite(&p,sizeof(vaccination),size,f1);
    fclose(f1);
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2022, 16:38
Ответы с готовыми решениями:

Ввод и вывод структуры в бинарный файл
Всем привет, друзья! Как вообще происходит Ввод и вывод структуры в бинарный файл. Можете...

Ввод/вывод структуры в текстовый и бинарный файл
есть код #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include...

Записать в бинарный файл массив объектов Student (бинарный файловый ввод/вывод)
Здравствуйте. Стоит задача записать в бинарный файл массив объектов student: class student {...

Бинарный файл (с++) и структуры
Пользователь вводит количество студентов. Вводится информация о студенте и тут же выводится в...

Структуры и бинарный файл
Здраствуйте, возникла проблема с бинарным файлом и с несколькими функциями. Весь проект не влез,...

8
Заблокирован
24.04.2022, 17:24 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// создание бинарного файла и запись в него массива структур
// struct vaccination длиной size элементов.
// З.Ы. size - здесь неудачное имя параметра, count лучше.
void creatDataFile(struct vaccination* p,int size)
{
    FILE *f1;
    char *name;
    puts("Введите имя файла:");
    scanf("%s",name);
    f1 = fopen(name,"wb");
    
    // size_t fwrite(const void *buf, size_t size, size_t count, FILE *stream);
    fwrite(p, sizeof(vaccination), size, f1);
    fclose(f1);
}
0
0 / 0 / 0
Регистрация: 28.03.2022
Сообщений: 16
24.04.2022, 20:06  [ТС] 3
Оп прав, адрес там не нужен, но все равно не работает же..
0
Заблокирован
24.04.2022, 20:13 4
Цитата Сообщение от bokazhoka Посмотреть сообщение
все равно не работает же..
В каком смысле? Файл не создаётся, штоли?
Так под переменную name память не выделена жэж.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// создание бинарного файла и запись в него массива структур
// struct vaccination длиной size элементов.
// З.Ы. size - здесь неудачное имя параметра, count лучше.
void creatDataFile(struct vaccination* p,int size)
{
    FILE *f1;
    char name[256]; // <----------------------------------- 
    puts("Введите имя файла:");
    scanf("%s",name);
    f1 = fopen(name,"wb");
    
    // size_t fwrite(const void *buf, size_t size, size_t count, FILE *stream);
    fwrite(p, sizeof(vaccination), size, f1);
    fclose(f1);
}
0
0 / 0 / 0
Регистрация: 28.03.2022
Сообщений: 16
24.04.2022, 20:15  [ТС] 5
или не прав он ниразу, нужен там &
но не работает независимо от этого

Добавлено через 1 минуту
Цитата Сообщение от Verevkin Посмотреть сообщение
Файл не создаётся, штоли?
так и есть
0
Заблокирован
24.04.2022, 20:49 6
Лучший ответ Сообщение было отмечено bokazhoka как решение

Решение

Цитата Сообщение от bokazhoka Посмотреть сообщение
так и есть
Было скучно. Набросал тебе пример.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <cstdio>
#include <cstdlib>
#include <cstring>
 
#pragma pack(1)
 
typedef struct // привитые 
{
    char FIO [40];
    char nameOfUnit [40];// Adres->подразделение
    int age;//numberOfHistori -> age
    char startOfVaccination [30];// entered -> начало прививки
    int yearOfVaccination;
    char endOfVaccination [30];//discharged->
    char nameOfVaccination [40];// dianosis -> 
    char duty [40];// второй диагноз > должность
} vaccination;
 
// создание бинарного файла и запись в него массива структур
// struct vaccination длиной size элементов.
// З.Ы. size - здесь неудачное имя параметра, count лучше.
int creatDataFile(vaccination* p, size_t count)
{
    char name[256];  
    puts("Введите имя файла:");
    scanf("%s", name);
    FILE* f1 = fopen(name, "wb");
    if (!f1) return -1; // error creating file
    
    // size_t fwrite(const void *buf, size_t size, size_t count, FILE *stream);
    int written = sizeof(vaccination) * fwrite(p, sizeof(vaccination), count, f1);
    fclose(f1);
    return written;
}
 
int main(void)
{
  system("chcp 1251 && cls");
  
  vaccination vac;
  memset(&vac, 0, sizeof(vac));
  vac.age = 100;
  vac.yearOfVaccination = 2021;
  strcpy(vac.FIO, "Vasya Poopkin");
  strcpy(vac.nameOfUnit, "Adres->подразделение");
  strcpy(vac.startOfVaccination, "entered -> начало прививки");
  strcpy(vac.endOfVaccination, "discharged->");
  strcpy(vac.nameOfVaccination, "dianosis -> ");
  strcpy(vac.duty, "второй диагноз > должность");
  
  int written = creatDataFile(&vac, 1);
  if (written < 0) printf("! Error occured.\n");
  else printf("$ %d байт записано.\n", written);
  
  return written;
}
Вывод структуры в бинарный файл


Вывод структуры в бинарный файл
0
414 / 287 / 59
Регистрация: 09.03.2016
Сообщений: 2,514
25.04.2022, 00:27 7
c style ?
рекомендуеться группировать
типы данных в структуре. (оптимизация)

C++
1
2
3
4
5
6
7
8
9
10
11
typedef struct // привитые 
{
  int age;//numberOfHistori -> age
  int yearOfVaccination;   
    char FIO [40];
    char nameOfUnit [40];// Adres->подразделение
    char startOfVaccination [30];// entered -> начало прививки
    char endOfVaccination [30];//discharged->
    char nameOfVaccination [40];// dianosis -> 
    char duty [40];// второй диагноз > должность
} vaccination;
Добавлено через 3 минуты
Саттер Г., Александреску А.
(по моему, не уверен)
но где то читал
0
1709 / 1109 / 337
Регистрация: 25.01.2019
Сообщений: 2,910
25.04.2022, 01:03 8
Цитата Сообщение от Наталья8 Посмотреть сообщение
рекомендуеться группировать
типы данных в структуре. (оптимизация)
Не просто группировать, а именно засовывать эти char[] в конец.
Есть такая штукак ак "выравнивание структуры"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
struct A
{
    int x;
    char b[3];
    char a[9];
};
 
struct B
{
    char a[9];
    int x;
    char b[3];
};
 
int main()
{
    std::cout << sizeof(A) << " " << sizeof(B);
    return 0;
}
Я б вообще, для надёжности, писал бы эти char[] как с контейнерами, отдельно; но эт моё ИМХО.
0
0 / 0 / 0
Регистрация: 28.03.2022
Сообщений: 16
05.05.2022, 22:02  [ТС] 9
ну тамщета все просто оказалось
C++
1
2
3
4
5
6
7
8
9
10
11
void createDataFile(struct vaccination* p,int size)
{
    FILE *f1;
    char name[20];
    
    puts("Введите имя файла:");
    scanf("%s",name);
    f1 = fopen(name,"wb");
    fwrite(&p, sizeof(vaccination), size, f1);
    fclose(f1);
}
0
05.05.2022, 22:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.05.2022, 22:02
Помогаю со студенческими работами здесь

Запись структуры в бинарный файл
Добрый вечере,народ. Нужна функция,которая будет записывать структуру в бинарный файл.То есть...

Запись структуры в бинарный файл
Доброй ночи, Не знаю насколько уместен мой вопрос на форуме так как он наполовину связан с...

Запись/Чтение структуры в файл (бинарный)
Всем привет! у меня такая задачка, очень простая. Нужно записать структуру в файл, а потом хочу...

Как записать данные в бинарный файл и вывести их на примере структуры?
У меня есть бинарний файл и когда я записую в него информацию через file&gt;&gt;information то...

Как записать в бинарный файл структуры записи из текстового файла?
Здравствуйте! Прошу помочь с чтением из текстового файла а затем запись всего что записано в...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru