Форум программистов, компьютерный форум CyberForum.ru

Чтение бинарного файла - C++

Восстановить пароль Регистрация
 
Olejan_one
1 / 1 / 0
Регистрация: 25.08.2012
Сообщений: 106
Завершенные тесты: 2
01.12.2012, 22:28     Чтение бинарного файла #1
Привет! Необходима помощь в таком вопросе - Создал программу для хранения сведений о пользователях(типа такого:
введите сведения:
пользователь 1 - Ф.И.О. номер телефона, адресс эл почты, номер аськи...пользователь 2 - .....итд)
В конце прога записывает все сведения в бинарный файл, после этого она их считывает из файла и выводит на экран.
Всё хорошо, всё работает НО - лишь только тогда когда я СНАЧАЛА записываю в файл и потом сразу считываю и вывожу на экран.
Мне хотелось бы сделать так, что бы следующий раз при открытии программы я мог их сразу считать ни прибегая к методу ввода.
короче одной фразой - я не могу просто открыть и сразу считать ранее записанные данные - выдает ошибку на этапе компиляции (пишет - возникшая проблема привела к прекращению работы программы). Помогите если кто знает в чем проблема. Заранее спасибо!=)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.12.2012, 22:28     Чтение бинарного файла
Посмотрите здесь:

Чтение из бинарного файла C++
Чтение из бинарного файла C++
Чтение бинарного файла C++
C++ Чтение из бинарного файла
C++ Чтение из бинарного файла
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
01.12.2012, 22:36     Чтение бинарного файла #2
Цитата Сообщение от Olejan_one Посмотреть сообщение
выдает ошибку на этапе компиляции
какой компилятор, номер и текст ошибки? И еще, желательно бы посмотреть код, который отвечает за чтение/запись
Olejan_one
1 / 1 / 0
Регистрация: 25.08.2012
Сообщений: 106
Завершенные тесты: 2
01.12.2012, 22:45  [ТС]     Чтение бинарного файла #3
компилятор - вижуал студио 2010
на счет номера ошибки - просто появляется окошко виндовс(номер не указан) -"возникшая проблема привела к прекращению работы программы. виндовс закроет эту программу, а если есть известный способ устранения проблемы, уведомит вас об этом"
вот код
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
void file_man(FILE *afp)    //метод записи в файл
    {
 
        int sz = strlen(name);
        fwrite(&sz,sizeof(sz),1,afp);
        fwrite(name,sz,1,afp);
        int sz1 = strlen(surname);
        fwrite(&sz1,sizeof(sz1),1,afp);
        fwrite(surname,sz1,1,afp);
 
         int sz2 = strlen(otchestvo);
        fwrite(&sz2,sizeof(sz2),1,afp);
        fwrite(otchestvo,sz2,1,afp);
        int sz3 = strlen(mail);
        fwrite(&sz3,sizeof(sz3),1,afp);
        fwrite(mail,sz3,1,afp);
        fwrite(&tell,sizeof (tell),1,afp); 
        fwrite(&icq,sizeof (icq),1,afp);
        fwrite(&date.day,sizeof (date.day),1,afp);
        int sz4 = strlen(date.month);
        fwrite(&sz4,sizeof(sz4),1,afp);
        fwrite(date.month,sz4,1,afp);
        fwrite(&date.year,sizeof (date.year),1,afp);
 
 
//метод чтения из бинарного файла
void read_person(FILE *afp2)
    {
        int sz = 0;
        fread(&sz,sizeof(sz),1,afp2);
        if(name) delete[] name;
        name = new char[sz+1];
        name[sz] = 0;
        fread(name,sz,1,afp2);
        int sz1 = 0;
        fread(&sz1,sizeof(sz1),1,afp2);
        if(surname) delete[] surname;
        surname = new char[sz1+1];
        surname[sz1] = 0;
        fread(surname,sz1,1,afp2);
 
        int sz2 = 0;
        fread(&sz2,sizeof(sz2),1,afp2);
        if(otchestvo) delete[] otchestvo;
        otchestvo = new char[sz2+1];
        otchestvo[sz2] = 0;
        fread(otchestvo,sz2,1,afp2);
        int sz3 = 0;
        fread(&sz3,sizeof(sz3),1,afp2);
        if(mail) delete[] mail;
        mail = new char[sz3+1];
        mail[sz3] = 0;
        fread(mail,sz3,1,afp2);
        fread(&tell,sizeof (tell),1,afp2); 
        fread(&icq,sizeof (icq),1,afp2);
        fread(&date.day,sizeof (date.day),1,afp2);
        int sz4 = 0;
        fread(&sz4,sizeof(sz4),1,afp2);
        if(date.month) delete[] date.month;
        date.month = new char[sz4+1];
        date.month[sz4] = 0;
        fread(date.month,sz4,1,afp2);
        fread(&date.year,sizeof (date.year),1,afp2);
 
    }
//реализация методов в мэйне, методы у меня под кейсами (реализовано меню)
void main()
{
 
case 4:
        {
            FILE *fp=fopen("first.txt","wb");
            if ((fp = fopen("first.txt", "wb")) == NULL)
            {
                cout<<"error";
                _getch();   
                return;
            }
            for (int i=0;i<size;i++)
            {
                mas[i]->file_man(fp);  
            }
            fclose(fp);
        }
        break;
    case 5:
        {
 
            FILE* fp2=fopen("first.txt","rb");
            if ((fp2 = fopen("first.txt", "rb")) == NULL)
            {
                cout<<"error";
                _getch();   
                return;
            }
            cin>>size;
            for(int i=0;i<size;i++)
            {
                mas[i]->read_person(fp2);
 
            }
            for(int i=0;i<size;i++)
            {
                
                
                cout<<"person "<<i+1<<":\n"<<"name:"<<mas[i]->name<<
                " "<<mas[i]->surname<<" "<<mas[i]->otchestvo<<"\n"<<
                "e-mail:"<<mas[i]->mail<<endl;
                cout<<"birsday:"<<mas[i]->date.day<<"."<<mas[i]->date.month<<"."<<mas[i]->date.year<<"\n";
                cout<<"nomber telephone:"<<mas[i]->tell<<"\n";
                cout<<"nomber ICQ:"<<mas[i]->icq<<"\n";
            }
            fclose(fp2);
        }   
        break;
 
 
 
 
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
01.12.2012, 22:58     Чтение бинарного файла #4
C++
1
2
FILE* fp2=fopen("first.txt","rb");
if ((fp2 = fopen("first.txt", "rb")) == NULL)
Зачем Вы два раза открываете фаил?
С открытием на запись - та же история

Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от Olejan_one Посмотреть сообщение
"возникшая проблема привела к прекращению работы программы. виндовс закроет эту программу, а если есть известный способ устранения проблемы, уведомит вас об этом"
Может всё-таки ошибка на этапе выполнения, а не компиляции?

Olejan_one
1 / 1 / 0
Регистрация: 25.08.2012
Сообщений: 106
Завершенные тесты: 2
01.12.2012, 23:02  [ТС]     Чтение бинарного файла #5
а как реализовать проверку на открытие файла? просто написать FILE *fp....if (fopen==NULL)....??

Добавлено через 1 минуту
да наверно ошибка не на этапе компиляции а на этапе выполнения!=)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
01.12.2012, 23:02     Чтение бинарного файла #6
C++
1
if ((fp2 = fopen("first.txt", "rb")) == NULL)
можно и так:
C++
1
2
FILE* fp2=fopen("first.txt","rb");
if(!fp2)
Olejan_one
1 / 1 / 0
Регистрация: 25.08.2012
Сообщений: 106
Завершенные тесты: 2
01.12.2012, 23:12  [ТС]     Чтение бинарного файла #7
Спасибо, но программа всё равно не работает. если записал и сразу считал не закрывая - работает, если записал, потом закрыл программу , открыл заново - не считывает.=(
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
01.12.2012, 23:14     Чтение бинарного файла #8
Можно полный код?
Olejan_one
1 / 1 / 0
Регистрация: 25.08.2012
Сообщений: 106
Завершенные тесты: 2
01.12.2012, 23:29  [ТС]     Чтение бинарного файла #9
да сейчас одну минутку

Добавлено через 14 минут
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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
#include <iostream>
#include <conio.h>
#include <string.h>
#include <stdio.h>
using namespace std;
struct data
{
    int day;
    char* month;
    int year;
};
class person
{
public:
    char* name;
    char* surname;
    char* otchestvo;
    int tell;
    int icq;
    char* mail;
    data date;
 
    person ()
    {
        name=NULL;
        surname=NULL;
        otchestvo=NULL;
        date.month=NULL;
        mail=NULL;
        icq=tell=date.day=date.year=0;
 
    }
    void set_person (char* aName,char* aSurname,char* aOtchestvo,char* aMail,int aDay,char* aMonth,int aYear,int aTell,int aIcq)
    {
        name=new char [strlen(aName)+1];
        strcpy(name, aName);
        surname=new char [strlen(aSurname)+1];
        strcpy(surname,aSurname);
        otchestvo=new char [strlen(aOtchestvo)+1];
        strcpy(otchestvo,aOtchestvo);
        mail=new char [strlen(aMail)+1];
        strcpy(mail,aMail);
        date.day=aDay;
        date.month=new char [strlen(aMonth)+1];
        strcpy(date.month,aMonth);
        date.year=aYear;
        strcpy(date.month,date.month);
        tell=aTell;
        icq=aIcq;
    }
    void get_person ()
    {
        cout<<"vyberite punct=\n1-vyvesti imya studenta\n2-vyvesti datu rogdeniya\n3-vyvesti nomer telefona\n"
            "4-vyvesti mail studenta\n5-vuvesti nomer icq"<<endl;
 
        int a;
        cin>>a;
        switch (a)
        {
        case 1:
            cout<<surname<<"."<<name<<"."<<otchestvo<<endl;
            break;
        case 2:
            cout<<date.day<<"."<<date.month<<"."<<date.year<<endl;
            break;
        case 3:
            cout<<tell;
            break;
        case 4:
 
            cout<<mail;
            break;
        case 5:
            cout<<icq;
            break;
        }
    }
    void print_person ()
 
    {
 
        cout<<"name - "<<surname<<"  "<<name<<"  "<<otchestvo<<endl;
        cout<<"date - "<<date.day<<"."<<date.month<<"."<<date.year<<endl;
        cout<<"telephone nomber - "<<tell<<endl;
        cout<<"mail - "<<mail<<endl;
        cout<<"icq nomber - "<<icq<<endl;
    }
    void file_man(FILE *afp)
    {
 
        int sz = strlen(name);
        fwrite(&sz,sizeof(sz),1,afp);
        fwrite(name,sz,1,afp);
        int sz1 = strlen(surname);
        fwrite(&sz1,sizeof(sz1),1,afp);
        fwrite(surname,sz1,1,afp);
 
        int sz2 = strlen(otchestvo);
        fwrite(&sz2,sizeof(sz2),1,afp);
        fwrite(otchestvo,sz2,1,afp);
        int sz3 = strlen(mail);
        fwrite(&sz3,sizeof(sz3),1,afp);
        fwrite(mail,sz3,1,afp);
        fwrite(&tell,sizeof (tell),1,afp); 
        fwrite(&icq,sizeof (icq),1,afp);
        fwrite(&date.day,sizeof (date.day),1,afp);
        int sz4 = strlen(date.month);
        fwrite(&sz4,sizeof(sz4),1,afp);
        fwrite(date.month,sz4,1,afp);
        fwrite(&date.year,sizeof (date.year),1,afp);
 
 
    }
    void read_person(FILE *afp2)
    {
        int sz = 0;
        fread(&sz,sizeof(sz),1,afp2);
        if(name) delete[] name;
        name = new char[sz+1];
        name[sz] = 0;
        fread(name,sz,1,afp2);
        int sz1 = 0;
        fread(&sz1,sizeof(sz1),1,afp2);
        if(surname) delete[] surname;
        surname = new char[sz1+1];
        surname[sz1] = 0;
        fread(surname,sz1,1,afp2);
 
        int sz2 = 0;
        fread(&sz2,sizeof(sz2),1,afp2);
        if(otchestvo) delete[] otchestvo;
        otchestvo = new char[sz2+1];
        otchestvo[sz2] = 0;
        fread(otchestvo,sz2,1,afp2);
        int sz3 = 0;
        fread(&sz3,sizeof(sz3),1,afp2);
        if(mail) delete[] mail;
        mail = new char[sz3+1];
        mail[sz3] = 0;
        fread(mail,sz3,1,afp2);
        fread(&tell,sizeof (tell),1,afp2); 
        fread(&icq,sizeof (icq),1,afp2);
        fread(&date.day,sizeof (date.day),1,afp2);
        int sz4 = 0;
        fread(&sz4,sizeof(sz4),1,afp2);
        if(date.month) delete[] date.month;
        date.month = new char[sz4+1];
        date.month[sz4] = 0;
        fread(date.month,sz4,1,afp2);
        fread(&date.year,sizeof (date.year),1,afp2);
 
    }
 
    ~person ()
    {
        delete[] name;
        delete[] surname;
        delete[] mail;
        delete[] otchestvo;
    }
};
 
void main ()
{int size=0;
person** mas=new person *[size];
char name[200];
char surname[200];
char otchestvo[200];
char mail [200];
int tell;
int icq;
int day;
int year;
char month[20];
 
int menu;
while (true)
{
    cout<<"\n\n";
    cout<<"***********Please choose a necessary point**************\n";
    cout<<"1-to enter information about an user\n2-search of user and request for concrete information\n"
        "3-conclusion of all information about a concrete user\n4-file do it\n5-file read\n\n";
 
 
    cin>>menu;
    switch (menu)
    {
    case 1:  //реализация метода ввода необходимо задать количество пользователей, которых буду вводить.
 
        cout << "___________Please enter the amount of users for the method of input:\n";
        cin>>size;
        for (int i=0;i<size;i++){
            cout<<"******person number"<<i+1<<" *****\n";
            mas[i]=new person;
            cout<<"please enter surname=";
            cin>>surname;
            cout<<"please enter name=";
            cin>>name;
            cout<<"please enter patronymic=";
            cin>>otchestvo;
            cout<<"please enter email=";
            cin>>mail;
            cout<<"please enter birsday=";
            cin>>day;
            cout<<"please enter month of birth=";
            cin>>month;
            cout<<"please enter year of birth=";
            cin>>year;
            cout<<"please enter telephone of user number=";
            cin>>tell;
            cout<<"please enter ICQ of user number=";
            cin>>icq;
            mas[i]->set_person (name,surname,otchestvo,mail,day,month,year,tell,icq);
            cout<<"------------------------------------------------------\n";
 
        }
        break;
        //________________________________________________________________________________________________________
    case 2:          //реализация метода поиска пользователя по фамилии
        char fam [20];
        cout<<"vvedite familiy personu=\n";
        cin>>fam;
 
        for(int i=0;i<size;i++)
        {
            
            if (stricmp(fam,mas[i]->surname)==0)
                mas[i]->get_person();
            
        }
        break;
 
    case 3: //реализация вывода всех сведений о пользователе        
        cout<<"vvedite nomer persony dlya vivoda vsex dannux\n";
        int r;
        cin>>r;
        if (*mas[r-1]->name!=NULL)
        {
            mas[r]->print_person ();
        }
        break;
 
        cout<<"file manager\n";
    case 4://запись в файл
        {
            FILE *fp=fopen("first.txt","wb");
            if (!fp)
            {
                cout<<"error";
                _getch();   
                return;
            }
            for (int i=0;i<size;i++)
            {
                mas[i]->file_man(fp);  
            }
            fclose(fp);
        }
        break;
    case 5://чтение из файла
        {
 
            FILE* fp2=fopen("first.txt","rb");
            if (!fp2)
            {
                cout<<"error";
                _getch();   
                return;
            }
            cout<<"vvedite size\n";
            cin>>size;//здесь небольшая недоработка (ещё не придумал) надо вводить количество введенных пользователей
                       //так как хочу реализовать работу метода считывания без метода ввода (в этом собственно и проблема)
                       //что бы можно было зайти в программу и сразу считать то что есть в файле.
                       //если же я сначала ввожу данные о пользователях - size задается вначале и здесь его не надо вводить.
            for(int i=0;i<size;i++)
            {
                mas[i]->read_person(fp2);
 
            }
            for(int i=0;i<size;i++)
            {
 
 
                cout<<"person "<<i+1<<":\n"<<"name:"<<mas[i]->name<<
                    " "<<mas[i]->surname<<" "<<mas[i]->otchestvo<<"\n"<<
                    "e-mail:"<<mas[i]->mail<<endl;
                cout<<"birsday:"<<mas[i]->date.day<<"."<<mas[i]->date.month<<"."<<mas[i]->date.year<<"\n";
                cout<<"nomber telephone:"<<mas[i]->tell<<"\n";
                cout<<"nomber ICQ:"<<mas[i]->icq<<"\n";
            }
            fclose(fp2);
        }   
        break;
 
    }
    _getch();
}
/*delete[] mas;*/
}
если что непонятно - спрашивайте.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
01.12.2012, 23:59     Чтение бинарного файла #10
Цитата Сообщение от Olejan_one Посмотреть сообщение
если что непонятно - спрашивайте.
C++
1
2
3
4
            for(int i=0;i<size;i++)
            {
                mas[i]->read_person(fp2); 
            }
У Вас нет выделения памяти под объект класса person и получается, что Вы пишите в никуда(точнее ошибка возникает при первом же обращении к полям класса.
Исправил на:
C++
1
2
3
4
5
            for(int i=0;i<size;i++)
            {
                    mas[i]=new person;
                mas[i]->read_person(fp2); 
            }
Все работает, только необходимо, естественно, позаботиться об утечках памяти.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2012, 03:18     Чтение бинарного файла
Еще ссылки по теме:

C++ Чтение бинарного файла
Чтение бинарного файла C++
C++ Чтение из бинарного файла

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

Или воспользуйтесь поиском по форуму:
Olejan_one
1 / 1 / 0
Регистрация: 25.08.2012
Сообщений: 106
Завершенные тесты: 2
02.12.2012, 03:18  [ТС]     Чтение бинарного файла #11
Спасибо большое Вам! Всё работает именно так как я хотел! Я бы сам ни когда бы не додумался это сделать. Разделил программу на кейсы и теперь память выделяется только в case1. Получается что массив объявлен в мэйне глобально а память под экземпляры класса только при вводе данных (case1).=)
Yandex
Объявления
02.12.2012, 03:18     Чтение бинарного файла
Ответ Создать тему
Опции темы

Текущее время: 09:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru