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

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

18.10.2014, 19:09. Показов 747. Ответов 6
Метки нет (Все метки)

Что я не так делаю ?Облазил много тем и так и не понял почему оно не работает.
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
int main(){
    int k;
    int n;
    int i;
    int j;
    int decision;
    int decision1;
    printf("Make your choice:\n");
    printf("1 - open exists file\n");
    printf("2 - create new file\n");
    scanf("%d",&decision);
        if(decision == 1){
            FILE* f = fopen("StructOutput.data","rb");
            fread(&n,sizeof(int),1,f);
            
            Note* Blocknote = (Note*)calloc(n,sizeof(Note));
            for(i=0;i<n;i++){
                fread(&Blocknote[i].Tel,sizeof(int),1,f);
                fread(&Blocknote[i].Bday[0],sizeof(int),1,f);
                fread(&Blocknote[i].Bday[1],sizeof(int),1,f);
                fread(&Blocknote[i].Bday[2],sizeof(int),1,f);   
                fread(&k,sizeof(int),1,f);
                fread(Blocknote[i].Name,k,1,f);
            
            }
            fclose(f);
            printf("Make your choice:\n");
            printf("1 - Add new information\n");
            printf("2 - Take exists information\n");
            scanf("%d",&decision1);
            if(decision1 == 1){
                Input(Blocknote,&n);
            }
            printf("Sorted: \n");
            Sort(Blocknote,n);
            for(i=0;i<n;i++)
                printf("[%d] = %s\n",i,Blocknote[i].Name);
                printf("\n");
                MonthSort(Blocknote,n);
                for(i=0;i<n;i++){
                free(Blocknote[i].Name);
                    }
            }
            
        if(decision == 2){
            FILE* f = fopen("StructOutput.data","wb");
            printf("Enter the number of person: \n");
            scanf("%d",&n);
            Note* Blocknote = (Note*)calloc(n,sizeof(Note));
            Input(Blocknote,&n);
            printf("WOT = %c\n",Blocknote[0].Name[0]);
            printf("Sorted: \n");
            Sort(Blocknote,n);
            for(i=0;i<n;i++)
                printf("[%d] = %s\n",i,Blocknote[i].Name);
                printf("\n");
            MonthSort(Blocknote,n);
            //for(i=0;i<n;i++){
            //free(Blocknote[i].Name);}
            
 
            fwrite(&n,sizeof(int),1,f);
            for(i=0;i<n;i++){
                k = strlen(Blocknote[i].Name);
                fwrite(&Blocknote[i].Tel,sizeof(int),1,f);
                fwrite(&Blocknote[i].Bday[0],sizeof(int),1,f);
                fwrite(&Blocknote[i].Bday[1],sizeof(int),1,f);
                fwrite(&Blocknote[i].Bday[2],sizeof(int),1,f);
                fwrite(&k,sizeof(int),1,f);
                fwrite(Blocknote[i].Name,k,1,f);
            }
            fclose(f);
                }
            
}
При попытке считать Blocknote[i].Name выдаёт ошибку!
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.10.2014, 19:09
Ответы с готовыми решениями:

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

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

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

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

6
3171 / 1930 / 313
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
18.10.2014, 19:52 2
Цитата Сообщение от IT-Alex Посмотреть сообщение
Что я не так делаю?
Все, кажется. Переменные не инициализированы, функция main не возвращает значения, структура, зачем-то, считывается и записывается поэлементно, освобожденные указатели не обнуляются, проверки кода возврата нет нигде, стиль отвратителен, код приведен неполностью, так что скомпилировать его невозможно...
0
Модератор
Эксперт по электронике
8517 / 6332 / 858
Регистрация: 14.02.2011
Сообщений: 22,019
18.10.2014, 19:55 3
Цитата Сообщение от IT-Alex Посмотреть сообщение
При попытке считать Blocknote[i].Name выдаёт ошибку!
а Blocknote[i].Name у нас кто?
0
Фрилансер
3688 / 2057 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
18.10.2014, 20:09 4
Цитата Сообщение от IT-Alex Посмотреть сообщение
При попытке считать Blocknote[i].Name выдаёт ошибку!
Конкретно по данной ошибке: Note.Name, судя по всему, указатель, поэтому между 22 и 23 строчками нужно его инициализировать, разместив нужное количество памяти под имя.
1
0 / 0 / 0
Регистрация: 06.09.2014
Сообщений: 14
18.10.2014, 20:22  [ТС] 5
Прошу прощения.Я кинул только тот кусок кода, который отвечает за запись и считывание информации.
Вот весь код целиком
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <getlines.h>
#define MAXLINE 100
 
 
struct Note
{
    
    int Tel;
    int Bday[3];
    char* Name;
};
 
void swap(Note* n,Note* m){
    Note c;
    c = *n;
    *n = *m;
    *m = c;
}
 
 
 
void Input(Note* Blocknote,int *n){
    int i;
    for(i = 0;i<*n;i++){
        char buff[200];
        printf("Enter Fisrt and Second names: \n");
        getchar();
        gets(buff);
        Blocknote[i].Name = strdup(buff);
        printf("Enter Telephone number: \n");
        scanf("%u",&Blocknote[i].Tel);
        printf("Enter birthday day: \n");
        scanf("%d",&Blocknote[i].Bday[0]);
        printf("Enter birthday month: \n");
        scanf("%d",&Blocknote[i].Bday[1]);
        printf("Enter birthday year: \n");
        scanf("%d",&Blocknote[i].Bday[2]);
        
        }   
}
 
void Sort(Note* Blocknote,int n){
    int i,j;
    for(i = 0;i<n;i++){
        for(j=0;j<n;j++){
            if(Blocknote[i].Bday[2] > Blocknote[j].Bday[2])
                swap(&Blocknote[i],&Blocknote[j]);
            else if(Blocknote[i].Bday[2] == Blocknote[j].Bday[2]){
                    if(Blocknote[i].Bday[1] > Blocknote[j].Bday[1])
                        swap(&Blocknote[i],&Blocknote[j]);}
                    else if(Blocknote[i].Bday[1] == Blocknote[j].Bday[1]){
                            if(Blocknote[i].Bday[0] > Blocknote[j].Bday[0])
                                swap(&Blocknote[i],&Blocknote[j]);}
            }
}
}
 
void MonthSort(Note* Blocknote,int n){
    int requirement;
    int flag = 0;
    printf("Enter sorting requirement: \n");
    scanf("%d",&requirement);
    int i,j;
    for(i = 0;i<n;i++){
            if(Blocknote[i].Bday[1] == requirement ){
                flag = 1;
                printf("Name :\t%s\nTelephone number:\t%d\nBirthday: \t%d-%d-%d\n\n",Blocknote[i].Name,Blocknote[i].Tel,
                Blocknote[i].Bday[0],Blocknote[i].Bday[1],Blocknote[i].Bday[2]);}
            if(flag == 0) printf("There are no people with this properties...\n");
}
}
 
 
 
int main(){
    int len;
    int n;
    int i;
    int j;
    int decision;
    int decision1;
    printf("Make your choice:\n");
    printf("1 - open exists file\n");
    printf("2 - create new file\n");
    scanf("%d",&decision);
        if(decision == 1){
            FILE* f = fopen("StructOutput.data","rb");
            fread(&n,sizeof(int),1,f);
            
            Note* Blocknote = (Note*)calloc(n,sizeof(Note));
            for(i=0;i<n;i++){
                fread(&Blocknote[i].Tel,sizeof(int),1,f);
                fread(&Blocknote[i].Bday[0],sizeof(int),1,f);
                fread(&Blocknote->Bday[1],sizeof(int),1,f);
                fread(&Blocknote[i].Bday[2],sizeof(int),1,f);   
                fread(&len,sizeof(int),1,f);
                fread(Blocknote[i].Name,1,len,f);
            
            }
            fclose(f);
            printf("Make your choice:\n");
            printf("1 - Add new information\n");
            printf("2 - Take exists information\n");
            scanf("%d",&decision1);
            if(decision1 == 1){
                Input(Blocknote,&n);
            }
            printf("Sorted: \n");
            Sort(Blocknote,n);
            for(i=0;i<n;i++)
                printf("[%d] = %s\n",i,Blocknote[i].Name);
                printf("\n");
                MonthSort(Blocknote,n);
                for(i=0;i<n;i++){
                free(Blocknote[i].Name);
                    }
            }
            
        if(decision == 2){
            FILE* f = fopen("StructOutput.data","wb");
            printf("Enter the number of person: \n");
            scanf("%d",&n);
            Note* Blocknote = (Note*)calloc(n,sizeof(Note));
            Input(Blocknote,&n);
            Sort(Blocknote,n);
            for(i=0;i<n;i++)
                printf("[%d] = %s\n",i,Blocknote[i].Name);
                printf("\n");
            MonthSort(Blocknote,n);
            //for(i=0;i<n;i++){
            //free(Blocknote[i].Name);}
            
 
            fwrite(&n,sizeof(int),1,f);
            for(i=0;i<n;i++){
                len = strlen(Blocknote[i].Name);
                fwrite(&Blocknote[i].Tel,sizeof(int),1,f);
                fwrite(&Blocknote[i].Bday[0],sizeof(int),1,f);
                fwrite(&Blocknote[i].Bday[1],sizeof(int),1,f);
                fwrite(&Blocknote[i].Bday[2],sizeof(int),1,f);
                fwrite(&len,sizeof(int),1,f);
                fwrite(Blocknote[i].Name,len,1,f);
            }
            fclose(f);
                }
 
}
0
Модератор
Эксперт по электронике
8517 / 6332 / 858
Регистрация: 14.02.2011
Сообщений: 22,019
18.10.2014, 20:27 6
Цитата Сообщение от IT-Alex Посмотреть сообщение
char* Name;
итак Name у нас указатель
а мы пытаемся в него k байт записать
Цитата Сообщение от IT-Alex Посмотреть сообщение
fread(Blocknote[i].Name,k,1,f);
разумеется код рухает
это еще повезло что имя больше чем 4 байта, иначе бы записалось бы но указатель указывал бы неизвестно куда
и тогда программа бы крашилась на совершенно разных местах, попробуй такую ошибку найди
воспользуйся советом Black Fregat,
0
0 / 0 / 0
Регистрация: 06.09.2014
Сообщений: 14
18.10.2014, 20:31  [ТС] 7
Мда,я тут 5 час его ломаю, разбираю на кирпичики считывания и запись, а проблема в выделении памяти под строку...эх.Спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2014, 20:31

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

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

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

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


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

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

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