Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/40: Рейтинг темы: голосов - 40, средняя оценка - 4.98
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 28

Запись структуры в файл

07.11.2013, 15:10. Показов 8077. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как правильно будет записать структуру данных в файл, что бы затем без проблем его можно было считать?

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
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
 
#define N 5
 
int main()
{
  FILE *fail_gr;  
struct knigi
{
int Nr, god;
char sifr[20], autor[20], nazvanie[20], kart_nr[9], familija[15], pas_dat[10];
} kniga[N];
int i,j,k,l;
 
do
{
system("cls");
printf("Vibor:\n");
printf("1 - posmtretj informaciju o knigax\n");
printf("2 - diopolnitj inf.\n");
printf("3 - \n");
 
printf("\n9 - Vixod\n");
 
             
scanf ("%d%*c",&k);
 
switch(k)
{
         case 1:
              system("cls"); 
              if ((fail_gr = fopen("knigi.txt", "r")) == NULL)
              {
                  printf("Fail ne bil najden, esli xotite zapisatj inf. o knigax vvedite cifru '1';\n");
                  printf("Esli xotite vernutsa nazad, viberete ljubuju druguju cufru: \n");
                  scanf ("%d%*c",&l);
                  if (l == 1)
                  {
                       system("cls");
                       printf("Zapolnite spisok\n");
                       for(i=0; l!=0; i++)
                       {
                       gramata[i].Nr = i+1;
                       printf("\nVvedite %d. informaciju o knige\n", i+1);
                       printf("Sifr knigi: ");
                       gets(kniga[i].sifr);
                       printf("Autor: ");
                       gets(kniga[i].autor);
                       printf("Nazvanie knigi: ");
                       gets(kniga[i].nazvanie);
                       printf("God vipuska: ");
                       scanf ("%d%*c",&kniga[i].god);
                       printf("Nomer karot4ki 4itatelja: ");
                       gets(kniga[i].kart_nr);
                       printf("Ego familija: ");
                       gets(kniga[i].familija);
                       printf("Pasutijuma datums: ");
                       gets(kniga[i].pas_dat);
                       
                       printf("Esli xotite vernutsa k viboru nazmite '0';\n");                      
                       printf("Esli xotite prodolzitj zapolnenija informaciji o knigax vvedite ljubuju druguju cifru:\n");
                       scanf ("%d%*c",&l);
                       }
                       fail_gr = fopen("knigi.txt", "w");
                       for(j=0; j<i; j++)
                       fwrite(&kniga, sizeof(kniga), 1, fail_gr);
                       fclose(fail_gr);
                  }
                  else
                  break;              
              }
              else
              {
              system("cls");
              printf("Informacija o knigax\n");
              for(j=0; j<i; j++)
               printf("%2d%6s%15s%25s%6d%10s%15s%10s\n", kniga[j].Nr, kniga[j].sifr, kniga[j].autor, kniga[j].nazvanie,
               kniga[j].god, kniga[j].kart_nr, kniga[j].familija, kniga[j].pas_dat); 
              system("pause");
              break;
              }
                              
              system("pause");
              break;
Пытался сделать, так чтобы программа сперва проверяла есть ли уже файл с структурами, если есть - то вывести информацию из файла на экран. Если же нет,то попросить пользователя ввести информацию - заполнить структуру данных. Когда пользователь заканчивает ввод данных - занести их в файл и затем считать их из файла, т.е. вывести на экран. Заполнение проходит нормально, но дальше в файл записывается не все корректно. Помогите разобраться в чем проблема...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.11.2013, 15:10
Ответы с готовыми решениями:

Запись структуры в файл
есть структура struct base { int id; char name; }; typedef struct base office; функция для записи в файл

Запись структуры в файл
Что я не так делаю ?Облазил много тем и так и не понял почему оно не работает. int main(){ int k; int n; int i; int j; int...

Запись структуры в файл
Дан файл (testNEW.txt), в котором записана информация о ноутбуках. Часть этой информации нужно записать в структуру. Затем отсортировать...

8
651 / 404 / 76
Регистрация: 21.09.2008
Сообщений: 1,396
07.11.2013, 19:59
В строке 46 что за gramata[i].Nr = i+1; ?
Компилятор ругается на Ваш пример (в строке 87 с оператором break ожидается определение или выражение).
0
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 28
07.11.2013, 21:15  [ТС]
Цитата Сообщение от sharpey Посмотреть сообщение
В строке 46 что за gramata[i].Nr = i+1; ?
Компилятор ругается на Ваш пример (в строке 87 с оператором break ожидается определение или выражение).
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
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
 
#define N 15
 
int main()
{
  FILE *fail_gr;  
struct knigi
{
int Nr, god;
char sifr[20], autor[20], nazvanie[20], kart_nr[9], familija[15], pas_dat[10];
} kniga[N];
int i,j,k,l;
 
do
{
system("cls");
printf("Vibor:\n");
printf("1 - posmtretj informaciju o knigax\n");
printf("2 - diopolnitj inf.\n");
printf("3 - \n");
 
printf("\n9 - Vixod\n");
 
             
scanf ("%d%*c",&k);
 
switch(k)
{
         case 1:
              system("cls"); 
              if ((fail_gr = fopen("knigi.txt", "r")) == NULL)
              {
                  printf("Fail ne bil najden, esli xotite zapisatj inf. o knigax vvedite cifru '1';\n");
                  printf("Esli xotite vernutsa nazad, viberete ljubuju druguju cufru: \n");
                  scanf ("%d%*c",&l);
                  if (l == 1)
                  {
                       system("cls");
                       printf("Zapolnite spisok\n");
                       for(i=0; l!=0; i++)
                       {
                       kniga[i].Nr = i+1;
                       printf("\nVvedite %d. informaciju o knige\n", i+1);
                       printf("Sifr knigi: ");
                       gets(kniga[i].sifr);
                       printf("Autor: ");
                       gets(kniga[i].autor);
                       printf("Nazvanie knigi: ");
                       gets(kniga[i].nazvanie);
                       printf("God vipuska: ");
                       scanf ("%d%*c",&kniga[i].god);
                       printf("Nomer karot4ki 4itatelja: ");
                       gets(kniga[i].kart_nr);
                       printf("Ego familija: ");
                       gets(kniga[i].familija);
                       printf("Data zakaza: ");
                       gets(kniga[i].pas_dat);
                       
                       printf("Esli xotite vernutsa k viboru nazmite '0';\n");                      
                       printf("Esli xotite prodolzitj zapolnenija informaciji o knigax vvedite ljubuju druguju cifru:\n");
                       scanf ("%d%*c",&l);
                       }
                       fail_gr = fopen("knigi.txt", "w");
                       for(j=0; j<i; j++)
                       fwrite(&kniga, sizeof(kniga), 1, fail_gr);
                       fclose(fail_gr);
                  }
                  else
                  break;              
              }
              else
              {
              system("cls");
              printf("Informacija o knigax\n");
              for(j=0; j<N; j++)
               printf("%2d%6s%15s%25s%6d%10s%15s%10s\n", kniga[j].Nr, kniga[j].sifr, kniga[j].autor, kniga[j].nazvanie,
               kniga[j].god, kniga[j].kart_nr, kniga[j].familija, kniga[j].pas_dat); 
              system("pause");
              break;
              }
 
             system("pause");
              break;   
                           
         case 2:
              system("cls");
              printf("Informacija o knigax\n");
              for(j=0; j<N; j++)
               printf("%2d%6s%15s%25s%6d%10s%15s%10s\n", kniga[j].Nr, kniga[j].sifr, kniga[j].autor, kniga[j].nazvanie,
               kniga[j].god, kniga[j].kart_nr, kniga[j].familija, kniga[j].pas_dat); 
              system("pause");
              break;
              
         case 9:
                break;          // exit(0);
                default: printf("\nNepraveljnij vibor");
                system("pause");
}//switch end
}// do end
while (k!=9);
}
Исправил - теперь при компиляции ошибок не выдает. Но в файл записывает, все равно, в вперемешку с нормальной информации не понятные символы. (" Й 1a ю" * $ю" Pushkin §i¬w9 Biografija ”9 9 121RD " ¤Petrov ¶К........")
Миниатюры
Запись структуры в файл   Запись структуры в файл  
0
651 / 404 / 76
Регистрация: 21.09.2008
Сообщений: 1,396
07.11.2013, 22:08
Даже если информация введена по одной книге, то в строке 79 выводятся информация по всем книгам (а поля-то остались с указателями на "мусор"). Для начала инициализируйте нулями в строке 15 массив структур:
} kniga[N] = {};
1
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 28
10.11.2013, 00:38  [ТС]
Цитата Сообщение от sharpey Посмотреть сообщение
Даже если информация введена по одной книге, то в строке 79 выводятся информация по всем книгам (а поля-то остались с указателями на "мусор"). Для начала инициализируйте нулями в строке 15 массив структур:
} kniga[N] = {};
Исправил, теперь в программе отображается все правильно, но в файл почему-то структура записывается по несколько раз. И как правильно добавить информацию, записать новые структуры в файл, не переписывая с самого начала файл, а дополняя его. Пробовал с помощью fail_gr = fopen("knigi.txt", "a"); но структуры снова заносятся по не сколько раз в файл.
И почему без 47 строчки ( j--; ), считывает на 1 структуру больше чем нужно - отображает пустую структуру (на месте kniga[i].Nr и kniga[i].god нули, а в остальных местах пустота).
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
 
#define N 20
 
int main()
{
  FILE *fail_gr;  
struct knigi
{
int Nr, god;
char sifr[20], autor[20], nazvanie[20], kart_nr[9], familija[15], pas_dat[10];
} kniga[N]={};
int i,j,k,l;
bool check;
 
do
{
system("cls");
printf("Vibor:\n");
printf("1 - Posmotretj informaciju o knigax iz fajla\n");
printf("2 - Dopolnitj informaciju o knigax\n");
printf("3 - Raspe4atatj spisok knig, u kotorix familija avtora na4inaetsa s bukvi 'A' \n");
printf("4 - Sozdatj novij fail s informaciej o knigax (esli takogo netu)\n");
 
printf("\n9 - Vixod iz programmi\n");
 
             
scanf ("%d%*c",&k);
 
switch(k)
{
         case 1:
              system("cls"); 
              if ((fail_gr = fopen("knigi.txt", "r")) == NULL)
                  printf("Fail ne bil najden, sperva ego nuzno sozdatj;\n");            
              else
              {
              system("cls");
              
              for(j=0; !feof(fail_gr); j++)
                fread(kniga, sizeof(kniga), 1, fail_gr);
              fclose(fail_gr);
              
              j--;
              printf("Informacija pro knigi\n");
              for(i=0; i<j; i++)
               printf("%2d%5s%13s%20s%5d%7s%13s%10s\n", kniga[i].Nr, kniga[i].sifr, kniga[i].autor, kniga[i].nazvanie, kniga[i].god, kniga[i].kart_nr, kniga[i].familija, kniga[i].pas_dat); 
              }                              
              system("pause");
              break;
         case 2:
              system("cls");
              if ((fail_gr = fopen("knigi.txt", "r")) == NULL)
                  printf("Fail ne bil najden, sperva ego nuzno sozdatj;\n");            
              else
              {
                       for(i=0,j=0; !feof(fail_gr); i++,j++)
                           fread(kniga, sizeof(kniga), 1, fail_gr);
                       fclose(fail_gr);
                       printf("Zapolnite, pozalujsta, spisok\n");
                       l=1;
                       
                       for(; l!=0; i++,j++)
                       {
                       kniga[i].Nr = i+1;
                       printf("\nVvedite %d. informaciju o knige\n", i+1);
                       printf("Sifr knigi: ");
                       gets(kniga[i].sifr);
                       printf("Familija avtora: ");
                       gets(kniga[i].autor);
                       printf("Nazvanie knigi: ");
                       gets(kniga[i].nazvanie);
                       printf("God izdanija: ");
                       scanf ("%d%*c",&kniga[i].god);
                       printf("Nomer karto4ki 4itatelja: ");
                       gets(kniga[i].kart_nr);
                       printf("Ego familija: ");
                       gets(kniga[i].familija);
                       printf("Data zakaza: ");
                       gets(kniga[i].pas_dat);
                       
                       printf("Esli xotite vernutsa k viboru - vvedite cifru -˜'0';\n");                      
                       printf("Esli xotite prodolzitj zapolnenie spiska - vvedite ljubuju druguju cifru:\n");
                       scanf ("%d%*c",&l);
                       }
                       fail_gr = fopen("knigi.txt", "w");
                       for(i=0; i<j; i++)
                         fwrite(&kniga, sizeof(kniga), 1, fail_gr);
                       fclose(fail_gr);    
              } 
              system("pause");
              break;
 
         case 3:
              system("cls");
              if ((fail_gr = fopen("knigi.txt", "r")) == NULL)
                  printf("Fail ne bil najden, sperva ego nuzno sozdatj;\n");            
              else
              {
              for(j=0; !feof(fail_gr); j++)
                 fread(kniga, sizeof(kniga), 1, fail_gr);
              fclose(fail_gr);
              check=true;
              printf("Spisok knig, u kotorix familija avtora na4inaetsa s bukvi 'A':\n");
              for(i=0; i<j; i++)
              {
                       if (kniga[i].autor[0]=='A')
                       {
                       printf("%s; ", kniga[i].nazvanie);
                       check=false;
                       }
              }
              if (check)
              printf("Nebilo najdeno niodnoj knigi.");
              }
              printf("\n");               
              system("pause");
              break;
 
 
         case 4:
              system("cls");
              if ((fail_gr = fopen("knigi.txt", "r")) == NULL)
              {
                       printf("Zapolnite, pozalujsta, spisok\n");
                       l=1;
                       for(i=0; l!=0; i++)
                       {
                       kniga[i].Nr = i+1;
                       printf("\nVvedite %d. informaciju o knige\n", i+1);
                       printf("Sifr knigi: ");
                       gets(kniga[i].sifr);
                       printf("Familija avtora: ");
                       gets(kniga[i].autor);
                       printf("Knigi nazvanie: ");
                       gets(kniga[i].nazvanie);
                       printf("God izdanija: ");
                       scanf ("%d%*c",&kniga[i].god);
                       printf("Nomer karto4ki 4itatelja: ");
                       gets(kniga[i].kart_nr);
                       printf("Ego familija: ");
                       gets(kniga[i].familija);
                       printf("Data zakaza: ");
                       gets(kniga[i].pas_dat);
                       
                       printf("Esli xotite vernutsa k viboru - vvedite cifru - '0';\n");                      
                       printf("Esli xotite prodolzitj zapolnenie spiska - vvedite ljubuju druguju cifru:\n");
                       scanf ("%d%*c",&l);
                       }    
                       fail_gr = fopen("knigi.txt", "w");
                       for(j=0; j<i; j++)
                         fwrite(&kniga, sizeof(kniga), 1, fail_gr);
                       fclose(fail_gr);
              }
              else
              printf("Fail uze sushestvuet.\n");
              system("pause");
              break;              
         case 9:
                break;          // exit(0);
                default: printf("\nNepraveljnij vibor.\n");
                system("pause");
}//switch end
}// do end
while (k!=9);
}                                        // main end
Миниатюры
Запись структуры в файл  
0
651 / 404 / 76
Регистрация: 21.09.2008
Сообщений: 1,396
10.11.2013, 14:10
Цитата Сообщение от Дантe Посмотреть сообщение
Исправил, теперь в программе отображается все правильно, но в файл почему-то структура записывается по несколько раз.
Вы имеете в виду блок кода в строках 154-156?

Цитата Сообщение от Дантe Посмотреть сообщение
И как правильно добавить информацию, записать новые структуры в файл, не переписывая с самого начала файл, а дополняя его. Пробовал с помощью fail_gr = fopen("knigi.txt", "a"); но структуры снова заносятся по не сколько раз в файл.
А Вы точно уверены, что оперируете именно структурами, а не всем массивом структур сразу, при чтении и записи?
Полезная информация о fopen. Далее: у Вас структура knigi содержит описание полей Nr, god как целых чисел, поэтому файл должен быть не текстовым, а двоичным. Поэтому режим открытия файла должен быть "ab+" или "ab".

Цитата Сообщение от Дантe Посмотреть сообщение
И почему без 47 строчки ( j--; ), считывает на 1 структуру больше чем нужно - отображает пустую структуру (на месте kniga[i].Nr и kniga[i].god нули, а в остальных местах пустота).
Чтение из файла поструктурно можно осуществить в строке 47 так:
fread(&kniga[j], sizeof(struct knigi), 1, fail_gr);

И добавьте заголовочный файл stdbool.h, без его указания gcc ругался на булевы переменные в режиме C99.

Хотите полезный совет? Научитесь использовать отладчик, встроенный в IDE (или отдельно gdb) - много вопросов можно решить быстрее и самостоятельно, чем дождаться советов гуру. )
Рекомендую отличные книги на эту тему:
- Джон Роббинс "Отладка приложений для Microsoft .NET и Microsoft Windows", 2004 год;
- Крис Х. Паппас, Уильям Х. Мюррей III "Отладка в C++. Руководство для разработчиков", 2001 г.
Если надо их - обращайтесь в личку.
1
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 28
10.11.2013, 15:30  [ТС]
Цитата Сообщение от sharpey Посмотреть сообщение
Вы имеете в виду блок кода в строках 154-156?
И 89 - 93.

Цитата Сообщение от sharpey Посмотреть сообщение
Далее: у Вас структура knigi содержит описание полей Nr, god как целых чисел, поэтому файл должен быть не текстовым, а двоичным. Поэтому режим открытия файла должен быть "ab+" или "ab".
Переписал везде, но все равно в файл не записывает год и номер и записывает символы конца строки или структуры.

Цитата Сообщение от sharpey Посмотреть сообщение
Чтение из файла поструктурно можно осуществить в строке 47 так:
fread(&kniga[j], sizeof(struct knigi), 1, fail_gr);
Спасибо, сейчас структуры записываются в файл по одному разу.

Цитата Сообщение от sharpey Посмотреть сообщение
И добавьте заголовочный файл stdbool.h, без его указания gcc ругался на булевы переменные в режиме C99.
Добавил, хотя разницы не вижу с ним и без него.

Цитата Сообщение от sharpey Посмотреть сообщение
Хотите полезный совет? Научитесь использовать отладчик, встроенный в IDE (или отдельно gdb) - много вопросов можно решить быстрее и самостоятельно, чем дождаться советов гуру. )
Рекомендую отличные книги на эту тему:
- Джон Роббинс "Отладка приложений для Microsoft .NET и Microsoft Windows", 2004 год;
- Крис Х. Паппас, Уильям Х. Мюррей III "Отладка в C++. Руководство для разработчиков", 2001 г.
Если надо их - обращайтесь в личку.
Буду благодарен, за такую информацию.

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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#include <stdio.h>
#include <windows.h>
#include <stdbool.h>
 
#define N 20
 
int main()
{
  FILE *fail_gr;  
struct knigi
{
int Nr, god;
char sifr[20], autor[20], nazvanie[20], kart_nr[9], familija[15], pas_dat[10];
} kniga[N]={};
int i,j,k,l,a;
bool check;
 
do
{
system("cls");
printf("Vibor:\n");
printf("1 - Posmotretj informaciju o knigax iz fajla\n");
printf("2 - Dopolnitj informaciju o knigax\n");
printf("3 - Raspe4atatj spisok knig, u kotorix familija avtora na4inaetsa s bukvi 'A' \n");
printf("4 - Sozdatj novij fail s informaciej o knigax (esli takogo netu)\n");
 
printf("\n9 - Vixod iz programmi\n");
 
             
scanf ("%d%*c",&k);
 
switch(k)
{
         case 1:
              system("cls"); 
              if ((fail_gr = fopen("knigi.txt", "rb")) == NULL)
                  printf("Fail ne bil najden, sperva ego nuzno sozdatj;\n");            
              else
              {
              system("cls");
              
              for(j=0; !feof(fail_gr); j++)
                fread(&kniga[j], sizeof(struct knigi), 1, fail_gr);
              fclose(fail_gr);
              j--;
              printf("Informacija pro knigi\n");
              for(i=0; i<j; i++)
               printf("%2d%5s%13s%20s%5d%7s%13s%10s\n", kniga[i].Nr, kniga[i].sifr, kniga[i].autor, kniga[i].nazvanie, kniga[i].god, kniga[i].kart_nr, kniga[i].familija, kniga[i].pas_dat); 
              }                              
              system("pause");
              break;
         case 2:
              system("cls");
              if ((fail_gr = fopen("knigi.txt", "rb")) == NULL)
                  printf("Fail ne bil najden, sperva ego nuzno sozdatj;\n");            
              else
              {
                       for(i=0; !feof(fail_gr); i++)
                           fread(&kniga[i], sizeof(struct knigi), 1, fail_gr);
                       fclose(fail_gr);
                       printf("Zapolnite, pozalujsta, spisok\n");
                       l=1;
                       i--;
                       for(a=i; l!=0; i++)
                       {
                       kniga[i].Nr = i+1;
                       printf("\nVvedite %d. informaciju o knige\n", i+1);
                       printf("Sifr knigi: ");
                       gets(kniga[i].sifr);
                       printf("Familija avtora: ");
                       gets(kniga[i].autor);
                       printf("Nazvanie knigi: ");
                       gets(kniga[i].nazvanie);
                       printf("God izdanija: ");
                       scanf ("%d%*c",&kniga[i].god);
                       printf("Nomer karto4ki 4itatelja: ");
                       gets(kniga[i].kart_nr);
                       printf("Ego familija: ");
                       gets(kniga[i].familija);
                       printf("Data zakaza: ");
                       gets(kniga[i].pas_dat);
                       
                       printf("Esli xotite vernutsa k viboru - vvedite cifru -˜'0';\n");                      
                       printf("Esli xotite prodolzitj zapolnenie spiska - vvedite ljubuju druguju cifru:\n");
                       scanf ("%d%*c",&l);
                       }
                       fail_gr = fopen("knigi.txt", "ab");
                       for(; a<i; a++)
                         fwrite(&kniga[a], sizeof(struct knigi), 1, fail_gr);
                       fclose(fail_gr);    
              } 
              system("pause");
              break;
 
         case 3:
              system("cls");
              if ((fail_gr = fopen("knigi.txt", "rb")) == NULL)
                  printf("Fail ne bil najden, sperva ego nuzno sozdatj;\n");            
              else
              {
              for(j=0; !feof(fail_gr); j++)
                 fread(&kniga[j], sizeof(struct knigi), 1, fail_gr);
              fclose(fail_gr);
              check=true;
              printf("Spisok knig, u kotorix familija avtora na4inaetsa s bukvi 'A':\n");
              for(i=0; i<j; i++)
              {
                       if (kniga[i].autor[0]=='A')
                       {
                       printf("%s; ", kniga[i].nazvanie);
                       check=false;
                       }
              }
              if (check)
              printf("Nebilo najdeno niodnoj knigi.");
              }
              printf("\n");               
              system("pause");
              break;
 
 
         case 4:
              system("cls");
              if ((fail_gr = fopen("knigi.txt", "rb")) == NULL)
              {
                       printf("Zapolnite, pozalujsta, spisok\n");
                       l=1;
                       for(i=0; l!=0; i++)
                       {
                       kniga[i].Nr = i+1;
                       printf("\nVvedite %d. informaciju o knige\n", i+1);
                       printf("Sifr knigi: ");
                       gets(kniga[i].sifr);
                       printf("Familija avtora: ");
                       gets(kniga[i].autor);
                       printf("Knigi nazvanie: ");
                       gets(kniga[i].nazvanie);
                       printf("God izdanija: ");
                       scanf ("%d%*c",&kniga[i].god);
                       printf("Nomer karto4ki 4itatelja: ");
                       gets(kniga[i].kart_nr);
                       printf("Ego familija: ");
                       gets(kniga[i].familija);
                       printf("Data zakaza: ");
                       gets(kniga[i].pas_dat);
                       
                       printf("Esli xotite vernutsa k viboru - vvedite cifru - '0';\n");                      
                       printf("Esli xotite prodolzitj zapolnenie spiska - vvedite ljubuju druguju cifru:\n");
                       scanf ("%d%*c",&l);
                       }    
                       fail_gr = fopen("knigi.txt", "wb");
                       for(j=0; j<i; j++)
                         fwrite(&kniga[j], sizeof(struct knigi), 1, fail_gr);
                       fclose(fail_gr);
              }
              else
              printf("Fail uze sushestvuet.\n");
              system("pause");
              break;              
         case 9:
                break;          // exit(0);
                default: printf("\nNepraveljnij vibor.\n");
                system("pause");
}//switch end
}// do end
while (k!=9);
}                                        // main end
Миниатюры
Запись структуры в файл  
0
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 28
11.11.2013, 14:08  [ТС]
Попробовал во всех режимах - "a", "a+", "ab", "ab+", "w", "w+", "wb", "wb+", ни в одном из них в файл целочисленные значения записываясь не видны ( kniga[i].Nr и kniga[i].god ). Подскажите, пожалуйста, в чем может быть проблема?
0
419 / 418 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
11.11.2013, 17:17
Вы же пишете дамп из памяти, поэтому числа идут в двоичном формате

Добавлено через 1 час 35 минут
Смотрите, я переделал немного ваш код, до конца не доделал, нет времени, но идею поймете, разберитесь с файловыми операциями и режимами открытия.
В таком виде логику программы проще разобрать, ну и вычислить ошибки.

Кликните здесь для просмотра всего текста
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#include <stdio.h>
//#include <windows.h>
#include <stdbool.h>
#include <stdlib.h>
 
#define N 20
 
typedef struct {
    int Nr, god;
    char sifr[20], autor[20], nazvanie[20], kart_nr[9], familija[15],
            pas_dat[10];
} knigi;
 
knigi edit_record(int i) {
    knigi kniga;
    kniga.Nr = i + 1;
    printf("\nVvedite %d. informaciju o knige\n", i + 1);
    printf("Sifr knigi: ");
    gets(kniga.sifr);
    printf("Familija avtora: ");
    gets(kniga.autor);
    printf("Knigi nazvanie: ");
    gets(kniga.nazvanie);
    printf("God izdanija: ");
    scanf("%d%*c", &kniga.god);
    printf("Nomer karto4ki 4itatelja: ");
    gets(kniga.kart_nr);
    printf("Ego familija: ");
    gets(kniga.familija);
    printf("Data zakaza: ");
    gets(kniga.pas_dat);
    return kniga;
}
 
bool file_io_check(FILE *fail_gr, const char *name, const char *mode) {
    bool fl = false;
    if ((fail_gr = fopen(name, mode)) == NULL ) {
        fl = false;
    } else
        fl = true;
    return fl;
}
 
void read_file(FILE *fail_gr, knigi *kniga, int *size) {
    //вообще-то лучше определить число записей и потом отдать в основную программу
    int i = 0;
    while (!feof(fail_gr))
        fread(&kniga[i++], sizeof(knigi), 1, fail_gr);
    *size = i - 1;
}
void write_record(FILE *fail_gr) {
}
 
bool check_eoi() {
    int fl;
    printf("Esli xotite vernutsa k viboru - vvedite cifru \'0\';\n");
    printf("Esli xotite prodolzitj zapolnenie spiska - vvedite ljubuju druguju cifru:\n");
    scanf("%d%*c", &fl);
    if (!fl)
        return false;
    else
        return true;
}
 
int main() {
    knigi kniga[N] = { };
    FILE *fail_gr;
    int i, j, k;
    bool check;
    int sz = 0; // размер массиа
    do {
        //system("cls");
        printf("Vibor:\n");
        printf("1 - Posmotretj informaciju o knigax iz fajla\n");
        printf("2 - Dopolnitj informaciju o knigax\n");
        printf(
                "3 - Raspe4atatj spisok knig, u kotorix familija avtora na4inaetsa s bukvi 'A' \n");
        printf(
                "4 - Sozdatj novij fail s informaciej o knigax (esli takogo netu)\n");
        printf("\n9 - Vixod iz programmi\n");
        scanf("%d%*c", &k);
 
        switch (k) {
        case 1:
            //system("cls");
            if (!file_io_check(fail_gr, "knigi.txt", "rb"))
                printf("Fail ne bil najden, sperva ego nuzno sozdatj;\n");
            else {
                //system("cls");
                read_file(fail_gr, kniga, &sz);
                fclose(fail_gr);
                printf("Informacija pro knigi\n");
                for (i = 0; i < sz; i++)
                    printf("%2d%5s%13s%20s%5d%7s%13s%10s\n", kniga[i].Nr,
                            kniga[i].sifr, kniga[i].autor, kniga[i].nazvanie,
                            kniga[i].god, kniga[i].kart_nr, kniga[i].familija,
                            kniga[i].pas_dat);
            }
            //system("pause");
            break;
        case 2:
            //system("cls");
            if (!file_io_check(fail_gr, "knigi.txt", "rb+"))
                printf("Fail ne bil najden, sperva ego nuzno sozdatj;\n");
            else {
                //
                printf("Zapolnite, pozalujsta, spisok\n");
                read_file(fail_gr, kniga, &sz);
                knigi tmp;
                while (check_eoi()) {
                    tmp=edit_record(sz++);
                    fwrite(&tmp, sizeof(knigi), 1, fail_gr);
                };
                fclose(fail_gr);
            }
            //system("pause");
            break;
 
        case 3:
            //system("cls");
            if (!file_io_check(fail_gr, "knigi.txt", "rb"))
                printf("Fail ne bil najden, sperva ego nuzno sozdatj;\n");
            else {
                read_file(fail_gr, kniga, &sz);
                fclose(fail_gr);
                check = true;
                printf(
                        "Spisok knig, u kotorix familija avtora na4inaetsa s bukvi 'A':\n");
                for (i = 0; i < j; i++) {
                    if (kniga[i].autor[0] == 'A') {
                        printf("%s; ", kniga[i].nazvanie);
                        check = false;
                    }
                }
                if (check)
                    printf("Nebilo najdeno niodnoj knigi.");
            }
            printf("\n");
            //system("pause");
            break;
 
        case 4:
            //system("cls");
            if (!file_io_check(fail_gr, "knigi.txt", "wb")) {
                    printf("Zapolnite, pozalujsta, spisok\n");
                    i = 0;
                    while (check_eoi()) {
                        kniga[i] = edit_record(i);
                        i++;
                    };
                    fail_gr = fopen("knigi.txt", "wb");
                    for (j = 0; j < i; j++)
                        fwrite(&kniga[j], sizeof(knigi), 1, fail_gr);
                    fclose(fail_gr);
            } else
                printf("Fail uze sushestvuet.\n");
            //system("pause");
            break;
        case 9:
            break;          // exit(0);
        default:
            printf("\nNepraveljnij vibor.\n");
            //system("pause");
            break;
        }          //switch end
    }          // do end
    while (k != 9);
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.11.2013, 17:17
Помогаю со студенческими работами здесь

Запись структуры в файл
Здравствуйте! Исходный код записи структуры в файл: #include &lt;stdio.h&gt; typedef __int8 BYTE; typedef __int32 DWORD; ...

Запись структуры в бинарный файл
если вам покажутся мои вопросы глупыми, не удивляйтесь, решил сам с нуля изучать си, есть книжки интернет и вы =) нужно записать...

Запись из структуры в файл и обратно
Всем привет! Никак не могу нормально считать и записать з файла в структуру и обратно. Коды функций: структура: struct hardware {...

Запись структуры папок в файл
С помощью system(&quot;tree /f&quot;) можно вывести на экран структуру папок того места где находится программа. Как сделать так, что бы информация...

Запись структуры в бинарный файл , пример
Здравствуйте . Есть ли у кого то пример программы записи структуры в бинарный файл, и вывод оттуда. Буду благодарна


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru