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

Запись класса в двоичный файл

12.09.2016, 05:25. Показов 8374. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день дорогие друзья.
никак не могу осуществить запись\чтение класса в двоичный файл. в принципе если говорить о записи, то на сколько позволяют судить мои скромные познания запись я произвожу, но когда пытаюсь прочитать ничего не выходит - получаю иероглиф. не мог бы кто поделится примером.

мой класс выглядит так:
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
class DATES {
    private:
        int day, month, year;
        char word; 
    public:
        void getDate () {
            cout << day << "." << month << "." << year << endl;
        }
        bool setDate () {
            cout << "day ";
            cin >> day;
            cout << "month ";
            cin >> month;
            cout << "year ";
            cin >> year;
            if (check (day, month, year) != 0) {
                cout << "wrong date";
                return false;
            }
            return true;
        }
        bool check (int day, int month, int year) {
            if (day < 1 && day > 31){
                return false;
            } else if (month < 1 && month > 12) {
                return false;
            } else if (year > 2016) {
                return false;
            }
            return true;
        }
};
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.09.2016, 05:25
Ответы с готовыми решениями:

Запись в двоичный файл
Нужно в двоичный файл 80-символьный заголовок и 4 байтовое беззнаковое целое число. //.. #include &lt;fstream&gt; ...

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

Запись двумерного вектора в двоичный файл
Предположим, что у меня есть двумерный вектор. Как записать его в бинарник? std::vector&lt;std::vector&lt;int&gt;&gt; main_vector; ...

13
1617 / 1182 / 553
Регистрация: 08.01.2012
Сообщений: 4,561
12.09.2016, 07:20
sizeof(DATES) сколько показывает?
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
12.09.2016, 08:09
Приведите Ваш код чтения/записи в файл?
0
0 / 0 / 1
Регистрация: 08.05.2016
Сообщений: 51
12.09.2016, 10:25  [ТС]
MansMI, показывает 16

zss, привожу
C++
1
2
3
4
fstream  fbin("1.bin", ios::binary | ios::in | ios::out);
    fbin.write((char*)&dateWrite, sizeof (dateWrite));
    fbin.read((char*)&dateRead, sizeof(dateRead));
    dateRead.getDate();
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
12.09.2016, 11:15
Pray, Приведи весь код в месте с main
0
0 / 0 / 1
Регистрация: 08.05.2016
Сообщений: 51
13.09.2016, 02:07  [ТС]
Avazart, привожу
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
#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>
 
using namespace std;
 
class DATES {
    private:
        int day, month, year;
        char word; 
    public:
        void getDate () {
            cout << day << "." << month << "." << year << endl;
        }
        bool setDate () {
            cout << "day ";
            cin >> day;
            cout << "month ";
            cin >> month;
            cout << "year ";
            cin >> year;
            if (check (day, month, year) != 0) {
                cout << "wrong date";
                //return false;
            }
            return true;
        }
        bool check (int day, int month, int year) {
            if (day < 1 && day > 31){
                return false;
            } else if (month < 1 && month > 12) {
                return false;
            } else if (year > 2016) {
                return false;
            }
            return true;
        }
};
 
int main () {
    DATES dateWrite, dateRead;
    if (dateWrite.setDate()){
    dateWrite.getDate();
    }
    //cout << "size " << sizeof(DATES) << endl;
    
    char filename[81];
        
    fstream  fbin("1.bin", ios::binary | ios::in | ios::out);
    fbin.write((char*)&dateWrite, sizeof (dateWrite));
    fbin.read((char*)&dateRead, sizeof(dateRead));
    dateRead.getDate();
    
    return 0;
}
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
13.09.2016, 02:46
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    fstream  fbin("1.bin", ios::binary | ios::out);
    if (fbin)
    {
        fbin.write((char*)&dateWrite, sizeof (dateWrite));
        fbin.close();
        fbin.open("1.bin", ios::in | ios::binary);
        if (fbin)
        {
            fbin.read((char*)&dateRead, sizeof(dateRead));
            dateRead.getDate();
            fbin.close();
        }
        else
            cout << "Error opening file for reading!" << endl;
    }
    else
        cout << "Error opening file for writing!" << endl;
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.09.2016, 11:47
C++
1
DATES dateWrite;
C++
1
fbin.write((char*)&dateWrite, sizeof (dateWrite));
Нельзя так делать с классами. Так можно поступать только со POD -структурами

Можно создать дополнительный метод, в котором почленно записывать данные.
Но вообще лучше писать не в бинарном виде а в каком нибудь текстовом формате типа xml или json.
К примеру удобно использовать boost::serialization
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
13.09.2016, 13:41
Цитата Сообщение от Avazart Посмотреть сообщение
Нельзя так делать с классами.
С чего бы это? С его классом, так, как раз, можно делать.

Добавлено через 2 минуты
Его ошибка была в том, что вот так файл не создастся:
Цитата Сообщение от Pray Посмотреть сообщение
C++
1
fstream *fbin("1.bin", ios::binary | ios::in | ios::out);
И переход от записи к чтению так просто не делается.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.09.2016, 14:28
Цитата Сообщение от nd2 Посмотреть сообщение
С чего бы это? С его классом, так, как раз, можно делать.
С того что не стоит так делать, всегда подобный класс может стать не POD, всегда нужно об этом думать.
Кроме того есть такая штука как выравнивание полей в структурах, чего лучше избегать и записывать почленно поля.
0
0 / 0 / 1
Регистрация: 08.05.2016
Сообщений: 51
13.09.2016, 15:36  [ТС]
Avazart, а можешь дать какие-нибудь учебные материалы или примеры как именно поступить в этом случае. на сколько я понял код представленный nd2 работает, но в некоторых случаях может привести к потере данных. Хотелось бы понять в каких и как этого избегать. Заранее спасибо вам обоим.

З.ы. текстовые и прочие форматы, это конечно замечательно, практично и удобно, но я ограничен заданием и оно предписывает именно двоичное хранение.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
13.09.2016, 15:42
Цитата Сообщение от Avazart Посмотреть сообщение
всегда подобный класс может стать не POD, всегда нужно об этом думать.
Цитата Сообщение от Avazart Посмотреть сообщение
Так можно поступать только со POD -структурами
А POD-структура не может стать не POD?
Цитата Сообщение от Avazart Посмотреть сообщение
Так можно поступать только со POD -структурами
Цитата Сообщение от Avazart Посмотреть сообщение
Кроме того есть такая штука как выравнивание полей в структурах
А на POD-структуры это не распространяется?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.09.2016, 15:50
Лучший ответ Сообщение было отмечено Pray как решение

Решение

Примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Date
{
    private:
        int day, month, year;
        char word; 
    public:
       // ...
       std::ostream& writeToBinStream(std::ostream& stream)
       {
            stream.write((char*)&day, sizeof(day));
            stream.write((char*)&month, sizeof(month));
            // ...
            return stream;
       } 
 
      std::istream& readFromBinStream(std::istream& stream)
      {
            stream.read((char*)&day, sizeof(day));
            stream.read((char*)&month, sizeof(month));
            // ...
            return stream;
      } 
}
C++
1
2
3
std::ifstream  fbin("1.bin", ios::binary);
Date d;
d.readFromBinStream(fbin);
Можно также ф-ции сделать дружественными.

Цитата Сообщение от nd2 Посмотреть сообщение
А POD-структура не может стать не POD?
Тут не структура, а класс по своей сути, в и вдруг мы заходим добавить конструктор или вирт.деструктор.
Цитата Сообщение от nd2 Посмотреть сообщение
А на POD-структуры это не распространяется?
Распространяется, поэтому лучше писать/читать почленно.
И еще не плохо бы проверять размеры типов(при компиляции), или же использовать типы с гарантированным размеров(на разных платформах)
2
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
13.09.2016, 16:01
Цитата Сообщение от Pray Посмотреть сообщение
Хотелось бы понять в каких и как этого избегать.
В каких к ошибкам приводит, можешь здесь почитать:
Запись и чтение структуры с файла
Код из "Р.Лафоре. ООП в С++"
Запись и чтение объектов разных классов в один файл
Запись и извлечение данных в несколько запусков программы
Не могу найти ошибку. Запись/чтение из файла
Насчёт проблем с выравниванием:
https://habrahabr.ru/post/142662/
http://www.kalinin.ru/programm... 7_00.shtml
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.09.2016, 16:01
Помогаю со студенческими работами здесь

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

Шаблон класса для записи данных в двоичный файл
Доброго времени суток! Нужно организовать шаблон для записи данных в двоичный файл. Но мне компилятор выдает следующие ошибки: ...

Запись в двоичный файл
Дана последовательность из n целых чисел. Создать файл и записать в него числа последовательности, попадающие в заданный интервал. Вывести...

Запись в двоичный файл
Я пишу в файл байты. Пишу из qint. Например, необходимо записать 00 00 00 ff. Записываю в файл. Но , он записывает как символы, т.е. в...

Запись в двоичный файл ошыбка
День добрый подскажите пожалуйста взял код отсюдова http://www.cyberguru.ru/programming/cpp-builder/borland-cpp-vcl-faq-page29.html но увы...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru