Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Deno95
10 / 10 / 10
Регистрация: 16.12.2013
Сообщений: 108
1

Запись в бинарный файл

05.04.2015, 19:28. Просмотров 536. Ответов 6
Метки нет (Все метки)

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

C++
1
2
3
4
5
6
7
8
9
10
11
 struct BD{
    char nameFilms[20];
    char topActor[30];
    char filmCompany[20];
    int god;
    int dd, mm, gggg;
    int kassa;
};
 
struct BD bd, *list, *ptrDB;
string namefile;
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
/*Добавить запись в БД*/
void add_record(void)
{
    ptrDB = new struct BD;
    char *str = new char[1024];
    int i = 0;
    
 
    ifstream filmsBD1(namefile.c_str(), ios::binary | ios_base::in);
    if (filmsBD1.fail()){
        system("cls");
        cout << "БД не подключена!!!" << endl << endl;
        delete ptrDB;
        filmsBD1.close();
        menu();
        return;
 
    }
 
    while (!filmsBD1.eof())
    {
        filmsBD1.getline(str, 1024, '\n');
        i++;
    }
    delete str;
    filmsBD1.close();
 
    ofstream filmsBD(namefile.c_str(), ios::binary | ios_base::app);
    if (filmsBD.fail()){
        system("cls");
        cout << "БД не подключена!!!" << endl << endl;
        delete ptrDB;
        menu();
        return;
 
    }
    else{
        system("cls");
        cout << "Заполните все пункты:" << endl << endl;
        cout << "1) Название фильма: "; cin >> ptrDB->nameFilms;
        cout << "2) Главные актер: "; cin >> ptrDB->topActor;
        cout << "3) Кинокомпания: "; cin >> ptrDB->filmCompany;
        cout << "4) Год выхода: "; 
        while (!(cin >> ptrDB->god) || (cin.peek() != '\n') || ptrDB->god < 1960 || ptrDB->god  > 2025)
        {
            cin.clear();
            while (cin.get() != '\n');
            cout << endl << "Некорректно введет год: ";
        }
        
        cout << "5) Дата премьеры (dd.mm.gggg):" << endl << endl; 
        
        cout << "dd: ";
        while (!(cin >> ptrDB->dd) || (cin.peek() != '\n') || ptrDB->dd < 1 || ptrDB->dd > 31)
        {
            cin.clear();
            while (cin.get() != '\n');
            cout << endl << "Некорректно введен день: ";
        }
 
        cout << "mm: ";
        while (!(cin >> ptrDB->mm) || (cin.peek() != '\n') || ptrDB->mm < 1 || ptrDB->mm > 12)
        {
            cin.clear();
            while (cin.get() != '\n');
            cout << endl << "Некорректно введет месяц: ";
        }
 
        cout << "gggg: ";
        while (!(cin >> ptrDB->gggg) || (cin.peek() != '\n') || ptrDB->gggg < 1960 || ptrDB->gggg > 2025)
        {
            cin.clear();
            while (cin.get() != '\n');
            cout << endl << "Некорректно введен год: ";
        }
 
        cout << endl << "6) Кассовые сборы: ";
        while (!(cin >> ptrDB->kassa) || (cin.peek() != '\n'))
        {
            cin.clear();
            while (cin.get() != '\n');
            cout << endl << "Некорректно введены кассовые сборы: ";
        }
 
            filmsBD << ptrDB->nameFilms << ' ' << ptrDB->topActor << ' ' << ptrDB->filmCompany << ' '
            << ptrDB->god << ' ' << ptrDB->dd << ' ' << ptrDB->mm << ' ' << ptrDB->gggg << ' ' << ptrDB->kassa << endl;
}
 
    filmsBD.close();
    delete ptrDB;
 
    system("cls");
    menu();
}
С обычным файлом все работает как надо но оказалось что надо сделать запись в бинарный.

Добавлено через 10 минут
Пробовал заменить
C++
1
2
filmsBD << ptrDB->nameFilms << ' ' << ptrDB->topActor << ' ' << ptrDB->filmCompany << ' '
            << ptrDB->god << ' ' << ptrDB->dd << ' ' << ptrDB->mm << ' ' << ptrDB->gggg << ' ' << ptrDB->kassa << endl;
на
C++
1
filmsBD.write((char*)&ptrDB, sizeof ptrDB);
Вроде что то записывает а правильно это или нет не знаю. Тут же сразу назревает вопрос как это вывести.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.04.2015, 19:28
Ответы с готовыми решениями:

Запись в бинарный файл
Здравствуйте. Прошу помочь разобраться с проблемой. Необходимо записать в двоичный файл...

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

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

Запись в бинарный файл
Всем привет. Подскажите пожалста как через fstream добавить запись в бинарный файл ? нужно...

Запись в бинарный файл
Скажите пожалуйста, правильно ли работает моя программа? (Имеется ввиду запись в бинарный файл) ...

6
zss
Модератор
Эксперт С++
9039 / 7843 / 4836
Регистрация: 18.12.2011
Сообщений: 20,896
Завершенные тесты: 1
05.04.2015, 19:51 2
С бинарным файлом надо работать именно через read и write (пишется целиком вся структура и читается тоже).
Выводить на экран так же, как и раньше. Структура ведь не нарушается.
Чтобы дописывать данные в конец можно использовать перемещение
C++
1
filmsBD.seekp(0,ios::end);
1
Deno95
10 / 10 / 10
Регистрация: 16.12.2013
Сообщений: 108
05.04.2015, 20:02  [ТС] 3
У меня получилось записать?

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
/*Добавить запись в БД*/
void add_record(void)
{
 
    ofstream filmsBD(namefile.c_str(), ios::binary | ios_base::app);
    if (filmsBD.fail()){
        system("cls");
        cout << "БД не подключена!!!" << endl << endl;
        delete ptrDB;
        menu();
        return;
 
    }
    else{
        system("cls");
        cout << "Заполните все пункты:" << endl << endl;
        cout << "1) Название фильма: "; cin >> bd.nameFilms;
        cout << "2) Главные актер: "; cin >> bd.topActor;
        cout << "3) Кинокомпания: "; cin >> bd.filmCompany;
        cout << "4) Год выхода: "; 
        while (!(cin >> bd.god) || (cin.peek() != '\n') || bd.god < 1960 || bd.god  > 2025)
        {
            cin.clear();
            while (cin.get() != '\n');
            cout << endl << "Некорректно введет год: ";
        }
        
        cout << "5) Дата премьеры (dd.mm.gggg):" << endl << endl; 
        
        cout << "dd: ";
        while (!(cin >> bd.dd) || (cin.peek() != '\n') || bd.dd < 1 || bd.dd > 31)
        {
            cin.clear();
            while (cin.get() != '\n');
            cout << endl << "Некорректно введен день: ";
        }
 
        cout << "mm: ";
        while (!(cin >> bd.mm) || (cin.peek() != '\n') || bd.mm < 1 || bd.mm > 12)
        {
            cin.clear();
            while (cin.get() != '\n');
            cout << endl << "Некорректно введет месяц: ";
        }
 
        cout << "gggg: ";
        while (!(cin >> bd.gggg) || (cin.peek() != '\n') || bd.gggg < 1960 || bd.gggg > 2025)
        {
            cin.clear();
            while (cin.get() != '\n');
            cout << endl << "Некорректно введен год: ";
        }
 
        cout << endl << "6) Кассовые сборы: ";
        while (!(cin >> bd.kassa) || (cin.peek() != '\n'))
        {
            cin.clear();
            while (cin.get() != '\n');
            cout << endl << "Некорректно введены кассовые сборы: ";
        }
 
        filmsBD.write((char*)&bd, sizeof BD);
}
 
    filmsBD.close();
 
    system("cls");
    menu();
}
В файл записались данные
wadawd awdawd awd Ю Ю rZ

Вывел я их так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
filmsBD.read((char*)&bd, sizeof bd);
            cout << " | " << bd.nameFilms << " | " << bd.topActor << " | " << bd.filmCompany << " | " << bd.god << " | ";
 
            if (bd.dd < 9)
                cout << "0" << bd.dd << ".";
            else
                cout << bd.dd << ".";
 
            if (bd.mm < 9)
                cout << "0" << bd.mm << ".";
            else
                cout << bd.mm << ".";
 
            cout << bd.gggg << " | " << bd.kassa << "$" << endl;
и получил нужные данные
0
zss
Модератор
Эксперт С++
9039 / 7843 / 4836
Регистрация: 18.12.2011
Сообщений: 20,896
Завершенные тесты: 1
05.04.2015, 20:25 4
Цитата Сообщение от Deno95 Посмотреть сообщение
В файл записались данные
wadawd awdawd awd Ю Ю rZ
В бинарном файл сложно что-либо разглядеть в текстовом режиме, т.к. это НЕ ТЕКСТ,
а двоичное представление Вашей структуры.
0
Deno95
10 / 10 / 10
Регистрация: 16.12.2013
Сообщений: 108
05.04.2015, 20:27  [ТС] 5
Что то я запутался, я не правильно записал ?
0
zss
Модератор
Эксперт С++
9039 / 7843 / 4836
Регистрация: 18.12.2011
Сообщений: 20,896
Завершенные тесты: 1
05.04.2015, 20:31 6
Все правильно. Но редактором текста просматривать такой файл БЕСПОЛЕЗНО.
1
Deno95
10 / 10 / 10
Регистрация: 16.12.2013
Сообщений: 108
05.04.2015, 20:47  [ТС] 7
Вы бы не могли еще подсказать как записать все в массив из файла

Добавлено через 13 минут
Разобрался, zss спасибо что помогли
0
05.04.2015, 20:47
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2015, 20:47

Запись в бинарный файл
Подскажите как записать данные из StringGrid в бинарный файл и компоновка допустим из 2 StringGrid ...

Запись в бинарный файл
Всем привет. Столкнулся с следующей проблемой при написании курсача,а именно с записью в бинарный в...

Чтение и запись в бинарный файл
Ребят nомогите мне nожалуйста. Я хочу nрочитать бинарный файл , в котором заnисаны данные в виде...


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

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

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