Как записать объект класса в бинарный файл?

Добрый день.

struct building
{
    char name[35];
    char city[20];
    int exams[5];
    char film[20];
    int years;
};

class stack
{
private:
    int size;
public:

    int top;
    building *pstack;
};

Как записать объект класса stack в бинарный файл?

Ну, примерно так:

#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

struct building
{
    char name[35];
    char city[20];
    int exams[5];
    char film[20];
    int years;

    bool write(ostream& os);            // второй способ
};

// второй способ
bool building::write(ostream& os) {
    os.write((char *)this, sizeof(building));
    return os.good();
}


const char *fname1 = "test1.dat";
const char *fname2 = "test2.dat";

int main()
{
    building bg1, bg2;
    strcpy(bg1.name, "Lenin");
    strcpy(bg1.city, "Magadan");
    strcpy(bg1.film, "Tarzan");
    bg1.years = 0xaabbccdd;
    strcpy(bg2.name, "Mira");
    strcpy(bg2.city, "Riga");
    strcpy(bg2.film, "Zizi");
    bg2.years = 0x11223344;
    for (int i = 0; i < 5; i++) {
        bg1.exams[i] = i;
        bg2.exams[i] = i * 2;
    }

    // первый способ
    ofstream ofs1(fname1, ios::binary | ios::out);
    if (ofs1) {
        ofs1.write((char *)&bg1, sizeof(building));
        ofs1.write((char *)&bg2, sizeof(building));
    }
    else
        cout << "File open error: " << fname1 << endl;

    // второй способ
    ofstream ofs2(fname2, ios::binary | ios::out);
    if (ofs2) {
        bg1.write(ofs2);
        bg2.write(ofs2);
    }
    else
        cout << "File open error: " << fname2 << endl;

    return 0;
}

Первый способ — в духе процедурного программирования.

Второй способ — в духе ООП.

В принципе оба способа эквипенисуарны.

Первый способ — в духе процедурного программирования.

Особенно хорошо смотрятся при этом объекты )))

Второй способ — в духе ООП.

тогда может просто перегрузить operator<< для ostream?

Я же четко в комментариях в программе пометил что относится ко второму способу. Так что твое замечание про объекты в процедурном программировании — не катит ))

Не, ну можно было конечно две программы в мессагу забубенить. Только там повтора было бы 70%.

Перегрузить operator<< для struct building не лучшая идея. В STL operator<< и operator>> используются для текстового ввода-вывода. А для unformattedread/write.

Кстати есть еще способ чтения-записи для бинарных файлов: старый добрый stdio.h (aka cstdio). Нетипобезопасно? А (char *)&bg1 — охрененно типобезопасно ))))

Так что твое замечание про объекты в процедурном программировании — не катит ))

ofs1.write — это контекст ООП, в процедурном стиле было бы что-то подобное:

write ( &ofs1 , &bg1, sizeof(building) )

В STL operator<< и operator>> используются для текстового ввода-вывода.

Я не писал, что нужно потом пихать всё в файл с помощью write и подобных функций. Если учесть, что в структуре в основном текстовая информация, то может стоит задуматься о выводе в файл не пучка байт?

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.