Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
2 / 2 / 0
Регистрация: 03.05.2014
Сообщений: 72
1

Запись структуры в файл

13.05.2016, 22:21. Показов 869. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дано код....описание : Запись множество обиектов в файл когда размеры порождаюших классов разные
Но я ни как не могу найти свзяь между некоторыми строками
Сразу скожу по русски плохо пишу и я новичек в C++
C++ (Qt)
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
#include <iostream>
#include <string>
#include <fstream>
#include <typeinfo>
#include <process.h>
 
using namespace std;
 
const int LEN = 32;
const int MAXEM = 100;
 
enum employee_type {tmanager,tscientist,tlaborer};
 
class employee
{
private:
    static int n;
    static employee *arrap[];
    unsigned long number;
    char name[LEN];
public:
    virtual void getdata()
    {cin >> name; cin >> number;}
    virtual void putdata()
    {cout << name << number << endl;}
    virtual employee_type get_type();
    static void add();
    static void display();
    static void read();
    static void write();
};
 
int employee::n;
employee *employee::arrap[MAXEM];
 
class manager:public employee{};
class scientist:public employee{};
class laborer:public employee{};
 
void employee::add()
{
    char ch;
    cout << "m - add manager\n"
                    "s - add scientist\n"
                    "l - add laborer";
    cin >> ch;
    switch(ch)
    {
    case 'm': arrap[n] = new manager; break;
    case 's': arrap[n] = new scientist; break;
    case 'l': arrap[n] = new laborer; break;
    default: cout << "Canot exist this type"; return;
    }
    arrap[n++]->getdata();
}
void employee::display()
{
    for(int i=0;i<n;i++)
    {
        cout << (i+1);
        switch(arrap[n]->get_type())
        {
        case tmanager: cout << "Type Manager:"; break;
        case tscientist: cout << "Type Scientist:"; break;
        case tlaborer: cout << "Type Laborer:"; break;
        default : cout << "Unknow Type"; 
        }
        arrap[i]->putdata();
    }
}
employee_type employee::get_type()
{
    if(typeid(*this) == typeid(manager))
        return tmanager;
    else if(typeid(*this) == typeid(scientist))
        return tscientist;
    else if(typeid(*this) == typeid(laborer))
        return tlaborer;
    else
    {cerr << "Unknow type"; exit(1);}
    return tmanager;
}
void employee::write()
{
    int size;
    cout << "Rec..." << n << endl;
    ofstream ouf;
    employee_type etype;
    ouf.open("emp.dat",ios::trunc|ios::binary);
    if(!ouf){cerr << "canot open the file"; return;}
    for(int i=0;i<n;i++)
    {
        etype = arrap[i]->get_type();
        ouf.write((char*)&etype,sizeof(etype));
        switch(etype)
        {
        case tmanager: size=sizeof(manager); break;
        case tscientist: size=sizeof(scientist); break;
                case tlaborer: size=sizeof(laborer); break;
        }
        if(!ouf){cerr << "Canot write in file"; return;}
 
    }
}
void employee::read()
{
    int size;
    employee_type etype;
    ifstream inf;
    inf.open("emp.dat",ios::binary);
    if(!inf){cerr << "Canot open the file"; return;}
    n = 0;
    while(true)
    {
        inf.read((char*)&etype,sizeof(etype));
        if(inf.eof()) break;
        if(!inf){cerr << "Canot read file"; return;}
        switch(etype)
        {
        case tmanager: arrap[n] = new manager; size=sizeof(manager); break;
        case tscientist: arrap[n] = new scientist; size=sizeof(scientist); break;
                case tlaborer: arrap[n] = new laborer; size=sizeof(laborer); break;
                default:cout << "Unknow Type file"; return;
        }
        inf.read((char*)arrap[n],size);
        if(!inf){cerr << "Canot read the file"; return;}
        n++;
    }
    cout << "Rec..." << n << endl;
}
 
int main()
{   
    char ch;
    while(true)
    {
        cout << "a - add employee\n"
                        "d - display\n"
                        "w - write in file\n"
                        "r - read the file";
        cin >> ch;
        switch(ch)
        {
        case 'a': employee::add(); break;
            case 'd': employee::display(); break;
                case 'w': employee::write(); break;
                    case 'r': employee::read(); break;
                    default: cout << "Unknow Type";
        }
    
 
    system("pause");
    return 0;
}
Собствено я не понемаю вот эти строки
C++ (Qt)
1
2
etype = arrap[i]->get_type();
        ouf.write((char*)&etype,sizeof(etype));
здесь в etype скажем будет tmanager но как sizeof(etype) знаеь оазмер класса manager я както не вижу такой запись
tmanager = manager;
банально говоря ведь get_type вернет всего лиши тип employee_type который просто равно 1 или tmanager

Еще непонятно вот это т кусок
C++ (Qt)
1
2
3
4
5
6
switch(etype)
        {
        case tmanager: size=sizeof(manager); break;
        case tscientist: size=sizeof(scientist); break;
                case tlaborer: size=sizeof(laborer); break;
        }
здесь size во первых нигде не используется во вторых она локалиная и уничтожается при выходе из функции
так зачем вообще этот кусок кода

И Практически не понемаю всю функцию employee::read()
там обявлена etype типа employee_type но ему ничего не присвоено а ниже функция read() котороя не знаю откуда берет размер класса и знает который класс передан
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.05.2016, 22:21
Ответы с готовыми решениями:

Запись в файл структуры
Есть структура Помогите реализовать запись в файл? Мой вариант не работает.......

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

запись структуры в файл
ПОМОГИТЕ пожалуйста......... не могу сделать так чтобы в файл по завершению работы программы...

Запись структуры в файл
Работаю в Borland C(чистый С) Нужно: Создать файл, который содержит ведомости об картотеке в...

1
7795 / 6561 / 2985
Регистрация: 14.04.2014
Сообщений: 28,683
14.05.2016, 17:30 2
Цитата Сообщение от vpavlov76 Посмотреть сообщение
как sizeof(etype) знаеь оазмер класса manager
Никак не знает. Записывается размер etype.
Цитата Сообщение от vpavlov76 Посмотреть сообщение
здесь size во первых нигде не используется
Эта функция неполная - записи объекта-то нет.
Цитата Сообщение от vpavlov76 Посмотреть сообщение
там обявлена etype типа employee_type но ему ничего не присвоено а ниже функция read() котороя не знаю откуда берет размер класса и знает который класс передан
Сначала считывается etype, чтобы знать какого типа объект дальше идёт, затем в size записывается размер и по нему идёт считывание содержимого.
0
14.05.2016, 17:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2016, 17:30
Помогаю со студенческими работами здесь

Запись структуры в файл
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &quot;stdafx.h&quot; int main() { struct TDataTime {...

Запись структуры в файл
Доброго времени суток! Программа: создается файл с данными художников ФИО автора , Наименование...

Запись структуры в файл.
Всем продуктивной ночи! Подскажите, хочу записать структуру в файл, нужно использовать fputs. Ну и...

Запись структуры в файл
Хочу записать структуру в файл. Но записывается только одна структура , последняя. #include...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru