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

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

07.11.2013, 15:10. Показов 5422. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.11.2013, 15:10
Ответы с готовыми решениями:

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

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

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

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

8
516 / 291 / 54
Регистрация: 21.09.2008
Сообщений: 982
07.11.2013, 19:59 2
В строке 46 что за gramata[i].Nr = i+1; ?
Компилятор ругается на Ваш пример (в строке 87 с оператором break ожидается определение или выражение).
0
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 28
07.11.2013, 21:15  [ТС] 3
Цитата Сообщение от 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
516 / 291 / 54
Регистрация: 21.09.2008
Сообщений: 982
07.11.2013, 22:08 4
Даже если информация введена по одной книге, то в строке 79 выводятся информация по всем книгам (а поля-то остались с указателями на "мусор"). Для начала инициализируйте нулями в строке 15 массив структур:
} kniga[N] = {};
1
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 28
10.11.2013, 00:38  [ТС] 5
Цитата Сообщение от 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
516 / 291 / 54
Регистрация: 21.09.2008
Сообщений: 982
10.11.2013, 14:10 6
Цитата Сообщение от Дант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  [ТС] 7
Цитата Сообщение от 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  [ТС] 8
Попробовал во всех режимах - "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 9
Вы же пишете дамп из памяти, поэтому числа идут в двоичном формате

Добавлено через 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.11.2013, 17:17

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

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

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

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


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

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

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