С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
IT-Alex
0 / 0 / 0
Регистрация: 06.09.2014
Сообщений: 14
1

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

18.10.2014, 19:09. Просмотров 581. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2014, 19:09
Ответы с готовыми решениями:

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

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

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

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

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

6
gazlan
3143 / 1920 / 311
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
18.10.2014, 19:52 2
Цитата Сообщение от IT-Alex Посмотреть сообщение
Что я не так делаю?
Все, кажется. Переменные не инициализированы, функция main не возвращает значения, структура, зачем-то, считывается и записывается поэлементно, освобожденные указатели не обнуляются, проверки кода возврата нет нигде, стиль отвратителен, код приведен неполностью, так что скомпилировать его невозможно...
0
ValeryS
Модератор
7375 / 5575 / 708
Регистрация: 14.02.2011
Сообщений: 18,952
18.10.2014, 19:55 3
Цитата Сообщение от IT-Alex Посмотреть сообщение
При попытке считать Blocknote[i].Name выдаёт ошибку!
а Blocknote[i].Name у нас кто?
0
Black Fregat
2632 / 1364 / 377
Регистрация: 31.05.2009
Сообщений: 5,167
18.10.2014, 20:09 4
Цитата Сообщение от IT-Alex Посмотреть сообщение
При попытке считать Blocknote[i].Name выдаёт ошибку!
Конкретно по данной ошибке: Note.Name, судя по всему, указатель, поэтому между 22 и 23 строчками нужно его инициализировать, разместив нужное количество памяти под имя.
1
IT-Alex
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
ValeryS
Модератор
7375 / 5575 / 708
Регистрация: 14.02.2011
Сообщений: 18,952
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
IT-Alex
0 / 0 / 0
Регистрация: 06.09.2014
Сообщений: 14
18.10.2014, 20:31  [ТС] 7
Мда,я тут 5 час его ломаю, разбираю на кирпичики считывания и запись, а проблема в выделении памяти под строку...эх.Спасибо.
0
18.10.2014, 20:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2014, 20:31

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

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

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


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

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

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