Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
1 / 1 / 2
Регистрация: 25.08.2012
Сообщений: 108

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

01.12.2012, 22:28. Показов 1930. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет! Необходима помощь в таком вопросе - Создал программу для хранения сведений о пользователях(типа такого:
введите сведения:
пользователь 1 - Ф.И.О. номер телефона, адресс эл почты, номер аськи...пользователь 2 - .....итд)
В конце прога записывает все сведения в бинарный файл, после этого она их считывает из файла и выводит на экран.
Всё хорошо, всё работает НО - лишь только тогда когда я СНАЧАЛА записываю в файл и потом сразу считываю и вывожу на экран.
Мне хотелось бы сделать так, что бы следующий раз при открытии программы я мог их сразу считать ни прибегая к методу ввода.
короче одной фразой - я не могу просто открыть и сразу считать ранее записанные данные - выдает ошибку на этапе компиляции (пишет - возникшая проблема привела к прекращению работы программы). Помогите если кто знает в чем проблема. Заранее спасибо!=)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.12.2012, 22:28
Ответы с готовыми решениями:

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется
Формат файла состоит из 3 структур и одной переменной. Подробное описание формата во вложении, просьба посмотреть его. У меня возникла...

Чтение из бинарного файла
Здравствуйте. У меня имеется некий класс Product, объекты которого хранятся в объекте класса Vector. Есть функция записи вектора в бинарный...

Чтение бинарного файла
Подскажите пожалуйста как можно правильно открыть бинарный файл не зная структуры? С чего мне начать? Вот пример:

10
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
01.12.2012, 22:36
Цитата Сообщение от Olejan_one Посмотреть сообщение
выдает ошибку на этапе компиляции
какой компилятор, номер и текст ошибки? И еще, желательно бы посмотреть код, который отвечает за чтение/запись
0
1 / 1 / 2
Регистрация: 25.08.2012
Сообщений: 108
01.12.2012, 22:45  [ТС]
компилятор - вижуал студио 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;
 
 
 
 
}
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
01.12.2012, 22:58
C++
1
2
FILE* fp2=fopen("first.txt","rb");
if ((fp2 = fopen("first.txt", "rb")) == NULL)
Зачем Вы два раза открываете фаил?
С открытием на запись - та же история

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

Не по теме:

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

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

Добавлено через 1 минуту
да наверно ошибка не на этапе компиляции а на этапе выполнения!=)
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
01.12.2012, 23:02
C++
1
if ((fp2 = fopen("first.txt", "rb")) == NULL)
можно и так:
C++
1
2
FILE* fp2=fopen("first.txt","rb");
if(!fp2)
1
1 / 1 / 2
Регистрация: 25.08.2012
Сообщений: 108
01.12.2012, 23:12  [ТС]
Спасибо, но программа всё равно не работает. если записал и сразу считал не закрывая - работает, если записал, потом закрыл программу , открыл заново - не считывает.=(
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
01.12.2012, 23:14
Можно полный код?
0
1 / 1 / 2
Регистрация: 25.08.2012
Сообщений: 108
01.12.2012, 23:29  [ТС]
да сейчас одну минутку

Добавлено через 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;*/
}
если что непонятно - спрашивайте.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
01.12.2012, 23:59
Цитата Сообщение от 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); 
            }
Все работает, только необходимо, естественно, позаботиться об утечках памяти.
0
1 / 1 / 2
Регистрация: 25.08.2012
Сообщений: 108
02.12.2012, 03:18  [ТС]
Спасибо большое Вам! Всё работает именно так как я хотел! Я бы сам ни когда бы не додумался это сделать. Разделил программу на кейсы и теперь память выделяется только в case1. Получается что массив объявлен в мэйне глобально а память под экземпляры класса только при вводе данных (case1).=)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.12.2012, 03:18
Помогаю со студенческими работами здесь

Чтение из бинарного файла
Уважаемые форумчане! Прошу помочь мне с чтением из бинарного файла. Проблема следующая. Есть функция, которая пишет в бинарный файл -...

Чтение бинарного файла
подскажите пожалуйста как можно из любого файла(*.bmp, *.mp3, *.avi и т.д.) получить двоичное представление этого файла или хотя бы считать...

Чтение бинарного файла
Здравствуйте. Есть код чтения бинарного файла: FILE *f; string tmp; char buff = {0}; f = fopen(&quot;data.bin&quot;,...

Чтение бинарного файла
как получить доступ к произвольному адресу файла? Нужно отправить файл через ком порт но не с 0 а с адреса 1а000 в цикле по 0х100 байт. с 0...

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru