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

Запись в файл, чтение из файла, сохранени в файл, не работают эти функции

07.07.2019, 01:03. Показов 5065. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Не работает методы:
Save() — сохранение фигуры (объекта) в файл,
Load() — считывание фигуры (объекта) из файла.

Я сделал проверку, что если что-то не так, то выходит ошибка работы с файлом, вот она все время и выходит и у меня не работают эти методы. Напишите, как правильно сделать эти методы.

Также я не понимаю вот это: В main создайте массив фигур, сохраните фигуры в файл, загрузите в другой массив и
отобразите информацию о каждой из фигур. вот что подчеркнул тоже не ясно, как реализовать. Зачем опять сохранять, если есть методы Load и Save?
Вот собственно код, сделал пока только первую фигуру - это квадрат, и пытаюсь сначала разобраться с ним.

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
#include <iostream>
#include <string>
#include <fstream>
#include <Windows.h>
using namespace std;
const char n = '\n';
//Создайте абстрактный класс Shape для плоских фигур.
//Определите виртуальные методы :
//•    Show() — вывод на экран информации о фигуре,
//•    Save() — сохранение фигуры(объекта) в файл,
//•    Load() — считывание фигуры(объекта) из файла.
//Определите производные классы :
//•    Square — квадрат, который характеризуется координатами левого верхнего угла и длиной стороны;
//•    Rectangle — прямоугольник с заданными координатами верхнего левого угла и размерами;
//•    Circle — окружность с заданными координатами центра и радиусом;
//•    Ellipse — эллипс с заданными координатами верхнего угла описанного вокруг него прямоугольника со сторонами, параллельными осям координат, и размерами этого прямоугольника.
//
//В main создайте массив фигур, сохраните фигуры в файл, загрузите в другой массив и отобразите информацию о каждой
//из фигур.
 
class Snape
{
public:
    Snape();
    Snape(string name) :name(name) {}
    virtual void Show() = 0; // вывод на экран информации о фигуре,
    virtual void Save() = 0;
    virtual void Load() = 0;
 
protected:
    string name;
};
 
class Square: public Snape
{
public:
    Square();
    Square(string name) :Snape(name) {}
    void Show() // вывод на экран информации о фигуре,
    {
        cout << "квадрат";
    }
 
    void Save() /* сохранение фигуры(объекта) в файл,*/
    {
        string path = "file.txt";
        fstream fs;
        fs.open(path, fstream::in | fstream::out | fstream::app);
 
        if (fs.is_open())
        {
            cout << "ошибка работы с файлом!!" << n;
        }
        else
        {
            string msg;
            int value;
            cout << "файл открыт!" << n;
            cout << "Введите 1 для записи в файл : " << n;
            cout << "Нажмите 2 для считывания : " << n;
            cin >> value;
 
            if (value == 1)
            {
                cout << "Введите параметры фигуры : " << n;
                SetConsoleCP(1251);
                cin >> msg;
                fs << msg << "\n";
                SetConsoleCP(866);
            }
 
            if (value == 2)
            {
                cout << "ЧТЕНИЕ ДАННЫХ ИЗ ФАЙЛА!" << n;
                while (!fs.eof())
                {
                    msg = "";
                    fs << msg;
                    cout << msg << n;
                }
            }
        }
        fs.close();
    }
 
    void Load()
    {
        string path = "file.txt";
        fstream fs;
        fs.open(path, fstream::in);
    }
private:
};
 
int main()
{
    setlocale(0, "");
 
    Snape* sn;
 
    Square sq("Квадрат");
 
    sn = &sq;
    sn->Show();
    sn->Save();
    sn->Load();
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.07.2019, 01:03
Ответы с готовыми решениями:

Реализовать функции: чтение из файла запись в файл
Взять произвольный текстовый файл (~500 символов). Заполнить &lt;map&gt; так, чтобы программа выводила...

Открытие и чтение файла, запись в файл, помещение результата в файл
Eсть алгоритм решения задачи. Не знаю только каким способом открыть файлы и как в них что-либо...

Запись в файл и чтение из файла
Подскажите, пожалуйста, почему в &quot;прочитанном&quot; последнее число дублируется? В чем ошибка? #include...

Чтение из файла, запись в файл
Тут такая у меня проблема. 1) Не работает цикл в майне. Как его правильно организовать? 2) И,...

21
Модератор
Эксперт С++
13508 / 10758 / 6412
Регистрация: 18.12.2011
Сообщений: 28,725
07.07.2019, 09:30 2
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
выходит ошибка работы с файлом
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
fs.open(path, fstream::in | fstream::out | fstream::app);
Вы пытаетесь открыть существующий файл, который находится в ТЕКУЩЕЙ директории.
Т.о.
1. Нельзя так создать новый файл
2. текущей является папка проекта при запуске программы из среды программирования, а не папка с .exe файлом.
0
6107 / 3462 / 1406
Регистрация: 07.02.2019
Сообщений: 8,803
07.07.2019, 09:35 3
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
сохранение фигуры(объекта) в файл
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
Нажмите 2 для считывания
В чем логика?
0
5 / 3 / 2
Регистрация: 29.11.2012
Сообщений: 531
07.07.2019, 09:42  [ТС] 4
Цитата Сообщение от zayats80888 Посмотреть сообщение
В чем логика?
вопрос не понял

Добавлено через 1 минуту
Цитата Сообщение от zss Посмотреть сообщение
1. Нельзя так создать новый файл
2. текущей является папка проекта при запуске программы из среды программирования, а не папка с .exe файлом.
А как правильно сделать?
0
6107 / 3462 / 1406
Регистрация: 07.02.2019
Сообщений: 8,803
07.07.2019, 09:50 5
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
Также я не понимаю вот это: В main создайте массив фигур, сохраните фигуры в файл, загрузите в другой массив и
отобразите информацию о каждой из фигур
От вас хотят "реализацию" полиморфизма. Т. е. нужен не массив фигур, а массив указателей на базовый класс. Сохранить не сложно, просто проходитесь и вызываете виртуальный метод для каждой фигуры, а вот что бы считать в такой же массив, придется написать функцию например, которая идентифицирует тип записанного объекта, считывает его(размещая в динамической памяти) и возвращает указатель на базовый класс. Поэтому я не догоняю смысл виртуального метода Load(), он должен вызываться для уже созданного объекта.

Добавлено через 1 минуту
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
вопрос не понял
У вас функция Save() читает файл?
0
5 / 3 / 2
Регистрация: 29.11.2012
Сообщений: 531
07.07.2019, 10:05  [ТС] 6
Цитата Сообщение от zss Посмотреть сообщение
Вы пытаетесь открыть существующий файл, который находится в ТЕКУЩЕЙ директории.
Т.о.
Я просто смотрел уроки и там они делали также и у них получалось, а у меня нет.

Добавлено через 1 минуту
Цитата Сообщение от zayats80888 Посмотреть сообщение
У вас функция Save() читает файл?
Да она все делает, просто я не знаю, как сделать чтобы только сохранять в файл.

Добавлено через 1 минуту
Цитата Сообщение от zayats80888 Посмотреть сообщение
Т. е. нужен не массив фигур,
А в задании написано:
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
В main создайте массив фигур,
Добавлено через 1 минуту
Цитата Сообщение от zayats80888 Посмотреть сообщение
он должен вызываться для уже созданного объекта.
Вызывать его, как я это делал.
0
Модератор
Эксперт С++
13508 / 10758 / 6412
Регистрация: 18.12.2011
Сообщений: 28,725
07.07.2019, 10:09 7
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
и и там они делали также
Можете вручную создать пустой файл в текущей папке, тогда, может, и получится.
Или по этой ошибке открыть файл только на запись, закрыть и снова открыть
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
fs.open(path, ios::in | ios::out | ios::app);
if ( !fs )
{
   fs.open(path, ios::out);
   if ( !fs )
   {
        cout << "ошибка создания файла!!" << endl;
        return;
   }
   fs.close();
   fs.open(path, ios::in | ios::out | ios::app);
   if ( !fs )
   {
        cout << "ошибка работы с файлом!!" << endl;
        return;
   }
}
Кстати!
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
if (fs.is_open())
Здесь потерялось отрицание
if ( !fs.is_open() )
0
5 / 3 / 2
Регистрация: 29.11.2012
Сообщений: 531
07.07.2019, 10:12  [ТС] 8
Цитата Сообщение от zss Посмотреть сообщение
Можете вручную создать пустой файл в текущей папке, тогда, может, и получится.
Я создавал, не выходило.
0
6107 / 3462 / 1406
Регистрация: 07.02.2019
Сообщений: 8,803
07.07.2019, 10:13 9
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
А в задании написано:
В задании глупость написана, вы не можете создать экземпляр абстрактного класса, вы не можете создать массив разных типов
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
Вызывать его, как я это делал.
Вызывать не проблема, смысл делать его виртуальным? Можно конечно в файле сначала записать типы всех фигур, потом записать в том же порядке данные этих фигур, а читать так: считываем типы и формируем массив указателей на не инициализированные объекты, затем проходимся по массиву и для каждого вызываем виртуальный метод Load(), но это то еще извращение, имхо
0
5 / 3 / 2
Регистрация: 29.11.2012
Сообщений: 531
07.07.2019, 10:20  [ТС] 10
Цитата Сообщение от zayats80888 Посмотреть сообщение
Вызывать не проблема, смысл делать его виртуальным? Можно конечно в файле сначала записать типы всех фигур, потом записать в том же порядке данные этих фигур, а читать так: считываем типы и формируем массив указателей на не инициализированные объекты, затем проходимся по массиву и для каждого вызываем виртуальный метод Load(), но это то еще извращение, имхо
Так задания не я придумываю, а место, где я учусь. У нас была тема: Виртуальные методы (абстрактный класс) вот по этому надо делать так, как в задании.
0
6107 / 3462 / 1406
Регистрация: 07.02.2019
Сообщений: 8,803
07.07.2019, 10:54 11
Anonymous4722, можно как то так, остальные фигуры сами реализуете
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <vector>
#include <fstream>
 
//Создайте абстрактный класс Shape для плоских фигур.
//Определите виртуальные методы :
//•  Show() — вывод на экран информации о фигуре,
//•  Save() — сохранение фигуры(объекта) в файл,
//•  Load() — считывание фигуры(объекта) из файла.
//Определите производные классы :
//•  Square — квадрат, который характеризуется координатами левого верхнего угла и длиной стороны;
//•  Rectangle — прямоугольник с заданными координатами верхнего левого угла и размерами;
//•  Circle — окружность с заданными координатами центра и радиусом;
//•  Ellipse — эллипс с заданными координатами верхнего угла описанного вокруг него прямоугольника со сторонами, параллельными осям координат, и размерами этого прямоугольника.
//
//В main создайте массив фигур, сохраните фигуры в файл, загрузите в другой массив и отобразите информацию о каждой
//из фигур.
 
 
class Shape
{
public:
 
    enum Shape_t
    {
        square_t = 123,
        rectangle_t,
        circle_t,
        ellipse
    };
 
    virtual void show(std::ostream&) const = 0; // вывод на экран информации о фигуре,
    virtual void save(std::ostream&) const = 0;
    virtual void load(std::istream&) = 0;
 
    virtual ~Shape() {}
protected:
    Shape_t m_id;
    Shape(Shape_t id) :m_id(id) {}
};
 
class Square : public Shape
{
public:
    Square() : Shape(square_t) {}
    Square(double top, double left, double side)
        : Shape(square_t), m_top(top), m_left(left), m_side(side)
    {}
 
    virtual ~Square() {}
 
    void show(std::ostream& os) const override
    {
        os
            << "square: "
            << m_top << ' '
            << m_left << ' '
            << m_side << std::endl;
    }
 
    void save(std::ostream& os) const override
    {
        os
            << m_id << ' '
            << m_top << ' '
            << m_left << ' '
            << m_side << std::endl;
    }
 
    void load(std::istream& is) override
    {
        is >> m_top >> m_left >> m_side;
    }
 
private:
 
    double m_top;
    double m_left;
    double m_side;
};
 
int main()
{
    {
        std::vector<Shape*> arr =
        {
            new Square(1,2,3),
            new Square(4,5,6),
            new Square(7,8,9)
        };
 
        std::ofstream ofs("file.txt", std::ios::trunc);
        for (auto s : arr)
        {
            s->save(ofs);
            delete s;
        }
    }
 
    std::ifstream ifs("file.txt");
    std::vector<Shape*> new_arr;
 
    for (int id, flag = 1; flag && ifs >> id;)
    {
        switch (id)
        {
        case Shape::square_t:
 
            new_arr.push_back(new Square());
            new_arr.back()->load(ifs);
            break;
 
            //...
 
        default:
            flag = 0;
        }
    }
 
    for (auto s : new_arr)
    {
        s->show(std::cout);
        delete s;
    }
}
0
Модератор
Эксперт С++
13508 / 10758 / 6412
Регистрация: 18.12.2011
Сообщений: 28,725
07.07.2019, 11:08 12
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
Я создавал, не выходило
Может поэтому:
Цитата Сообщение от zss Посмотреть сообщение
Здесь потерялось отрицание
if ( !fs.is_open() )
0
5 / 3 / 2
Регистрация: 29.11.2012
Сообщений: 531
07.07.2019, 11:09  [ТС] 13
Цитата Сообщение от zss Посмотреть сообщение
Может поэтому:
Да я догадался и все заработало. Но надо улучшить программу и сделать четко, чем я и займусь.
0
5 / 3 / 2
Регистрация: 29.11.2012
Сообщений: 531
07.07.2019, 20:16  [ТС] 14
Цитата Сообщение от zayats80888 Посмотреть сообщение
остальные фигуры сами реализуете
Я сделал, а у меня выводит ошибку. И векторы я не проходил еще. Как это сделать для след фигур? Классы я организовал, а в main выводит ошибки: требуется спецификатор типа.
0
6107 / 3462 / 1406
Регистрация: 07.02.2019
Сообщений: 8,803
07.07.2019, 20:57 15
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
Я сделал, а у меня выводит ошибку.
Показывай что сделал
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
И векторы я не проходил еще.
тогда динамический массив, а размер массива нужно записывать в файл
0
5 / 3 / 2
Регистрация: 29.11.2012
Сообщений: 531
07.07.2019, 21:18  [ТС] 16
Цитата Сообщение от zayats80888 Посмотреть сообщение
Показывай что сделал
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <fstream>
#include <Windows.h>
#include <vector>
using namespace std;
/*Создайте абстрактный класс Shape для плоских фигур.
Определите виртуальные методы:
•  Show() — вывод на экран информации о фигуре,
•  Save() — сохранение фигуры (объекта) в файл,
•  Load() — считывание фигуры (объекта) из файла.
Определите производные классы:
•  Square — квадрат, который характеризуется координатами левого верхнего угла и длиной стороны;
•  Rectangle — прямоугольник с заданными координатами верхнего левого угла и размерами;
•  Circle — окружность с заданными координатами центра и радиусом;
•  Ellipse — эллипс с заданными координатами верхнего угла описанного вокруг 
него прямоугольника со сторонами, параллельными осям координат, и размерами этого прямоугольника.
 
В main создайте массив фигур, сохраните фигуры в файл, загрузите в другой массив и отобразите информацию о каждой
из фигур.*/
 
class Shape
{
public:
 
    enum Shape_t
    {
        square_t = 123,
        rectangle_t,
        circle_t,
        ellipse
    };
 
    virtual void show(std::ostream&) const = 0; // вывод на экран информации о фигуре,
    virtual void save(std::ostream&) const = 0;
    virtual void load(std::istream&) = 0;
    Shape();
    virtual ~Shape() {}
protected:
    Shape_t m_id;
    Shape(Shape_t id) :m_id(id) {}
};
 
class Square : public Shape
{
public:
    Square() : Shape(square_t) {}
    Square(double top, double left, double side)
        : Shape(square_t), m_top(top), m_left(left), m_side(side)
    {}
 
    virtual ~Square() {}
 
    void show(ostream& os) const override
    {
        os
            << "square: "
            << m_top << ' '
            << m_left << ' '
            << m_side << endl;
    }
 
    void save(ostream& os) const override
    {
        os
            << m_id << ' '
            << m_top << ' '
            << m_left << ' '
            << m_side << endl;
    }
 
    void load(istream& is) override
    {
        is >> m_top >> m_left >> m_side;
    }
private:
    double m_top;
    double m_left;
    double m_side;
};
 
class Rectangle : public Shape
{
public:
    Rectangle() : Shape(rectangle_t) {}
    Rectangle(double top, double left, double size)
        :Shape(rectangle_t), m_top(top), m_left(left), m_size(size) {}
    virtual ~Rectangle() {}
 
    void show(ostream& os) const override
    {
        os
            << "rectangle: "
            << m_top << ' '
            << m_left << ' '
            << m_size << endl;
    }
 
    void save(ostream& os) const override
    {
        os
            << m_id << ' '
            << m_top << ' '
            << m_left << ' '
            << m_size << endl;
    }
 
    void load(istream& is) override
    {
        is >> m_top >> m_left >> m_size;
    }
private:
    double m_top;
    double m_left;
    double m_size;
};
 
int main()
{
    setlocale(0, "");
    system("Color F0");
    
    vector<Shape*> arr =
    {
        new Square(1,2,3),
        new Square(4,5,6),
        new Square(7,8,9),
 
        new Rectangle(1,2,3),
        new Rectangle(4,5,6),
        new Rectangle(7,8,9)
    };
 
        ofstream ofs("file.txt", ios::trunc);
 
        for (auto s : arr)
        {
            s->save(ofs);
            delete s;
        }
    
 
    ifstream ifs("file.txt");
    vector<Shape*> new_arr;
 
    for (int id, flag = 1; flag && ifs >> id;)
    {
        switch (id)
        {
        case Shape::rectangle_t:
            new_arr.push_back(new Rectangle());
            new_arr.back()->load(ifs);
            break;
            //...
        default:
            flag = 0;
        }
    }
 
    for (auto s : new_arr)
    {
        s->show(cout);
        delete s;
    }
 
    for (int id, flag=1;flag && ifs >> id;)
    {
        switch (id)
        {
        case Shape::square_t:
            new_arr.push_back(new Square());
            new_arr.back()->load(ifs);
            break;
            //...
        default:
            flag = 0;
        }
    }
 
    for (auto s : new_arr)
    {
        s->show(cout);
        delete s;
    }   
}


Добавлено через 2 минуты
Цитата Сообщение от zayats80888 Посмотреть сообщение
тогда динамический массив, а размер массива нужно записывать в файл
Это могу сделать, но можно и с векторами.
Тут надо уже делать 4 вектора чтобы заработало или что? Не понятно.

Наверное динамический массив сделаю, потому что с вектором не понимаю, как делать надо.

Или лучше покажите, как с вектором сделать правильно еще одну фигуру чтобы я имел представление, как пользоваться векторами с несколькими классами.
0
6107 / 3462 / 1406
Регистрация: 07.02.2019
Сообщений: 8,803
07.07.2019, 21:26 17
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
требуется спецификатор типа.
А все потому, что using namespace std;. Убери #include <Windows.h>

Добавлено через 1 минуту
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
Rectangle — прямоугольник с заданными координатами верхнего левого угла и размерами;
размерЫ , а у тебя Rectangle это копия Square.
Зачем конструктор по умолчанию в базовый класс прилепил?
0
5 / 3 / 2
Регистрация: 29.11.2012
Сообщений: 531
07.07.2019, 21:29  [ТС] 18
Цитата Сообщение от zayats80888 Посмотреть сообщение
Зачем конструктор по умолчанию в базовый класс прилепил?
Потому что он ругался на то что нет конструктора по умолчанию.

Добавлено через 29 секунд
Цитата Сообщение от zayats80888 Посмотреть сообщение
А все потому, что using namespace std;. Убери #include <Windows.h>
Убрал и вроде как нет ошибок, но почему она возникла из-за Windows.h??
0
6107 / 3462 / 1406
Регистрация: 07.02.2019
Сообщений: 8,803
07.07.2019, 21:40 19
Так же внимательно посмотри, что в моем коде участок, ответственный за изначальную инициализацию и запись в файл, локализован фигурными скобками, зачем удалил?

Добавлено через 43 секунды
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
Потому что он ругался на то что нет конструктора по умолчанию.
А где ты его вызываешь? Удали. Все равно не реализован.

Добавлено через 8 минут
Цитата Сообщение от Anonymous4722 Посмотреть сообщение
но почему она возникла из-за Windows.h??
Вот почему
https://msdn.microsoft.com/en-... p/dd162898
0
5 / 3 / 2
Регистрация: 29.11.2012
Сообщений: 531
07.07.2019, 21:41  [ТС] 20
Цитата Сообщение от zayats80888 Посмотреть сообщение
А где ты его вызываешь? Удали. Все равно не реализован.
Удалил, сейчас пытался добавить новую фигуру вот так:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
/*Создайте абстрактный класс Shape для плоских фигур.
Определите виртуальные методы:
•  Show() — вывод на экран информации о фигуре,
•  Save() — сохранение фигуры (объекта) в файл,
•  Load() — считывание фигуры (объекта) из файла.
Определите производные классы:
•  Square — квадрат, который характеризуется координатами левого верхнего угла и длиной стороны;
•  Rectangle — прямоугольник с заданными координатами верхнего левого угла и размерами;
•  Circle — окружность с заданными координатами центра и радиусом;
•  Ellipse — эллипс с заданными координатами верхнего угла описанного вокруг 
него прямоугольника со сторонами, параллельными осям координат, и размерами этого прямоугольника.
 
В main создайте массив фигур, сохраните фигуры в файл, загрузите в другой массив и отобразите информацию о каждой
из фигур.*/
 
class Shape
{
public:
 
    enum Shape_t
    {
        square_t = 123,
        rectangle_t,
        circle_t,
        ellipse
    };
 
    virtual void show(std::ostream&) const = 0; // вывод на экран информации о фигуре,
    virtual void save(std::ostream&) const = 0;
    virtual void load(std::istream&) = 0;
    virtual ~Shape() {}
protected:
    Shape_t m_id;
    Shape(Shape_t id) :m_id(id) {}
};
 
class Square : public Shape
{
public:
    Square() : Shape(square_t) {}
    Square(double top, double left, double side)
        : Shape(square_t), m_top(top), m_left(left), m_side(side)
    {}
 
    virtual ~Square() {}
 
    void show(ostream& os) const override
    {
        os
            << "square: "
            << m_top << ' '
            << m_left << ' '
            << m_side << endl;
    }
 
    void save(ostream& os) const override
    {
        os
            << m_id << ' '
            << m_top << ' '
            << m_left << ' '
            << m_side << endl;
    }
 
    void load(istream& is) override
    {
        is >> m_top >> m_left >> m_side;
    }
private:
    double m_top;
    double m_left;
    double m_side;
};
 
class Rectangle : public Shape
{
public:
    Rectangle() : Shape(rectangle_t) {}
    Rectangle(double top, double left, double size)
        :Shape(rectangle_t), m_top(top), m_left(left), m_size(size) {}
    virtual ~Rectangle() {}
 
    void show(ostream& os) const override
    {
        os
            << "rectangle: "
            << m_top << ' '
            << m_left << ' '
            << m_size << endl;
    }
 
    void save(ostream& os) const override
    {
        os
            << m_id << ' '
            << m_top << ' '
            << m_left << ' '
            << m_size << endl;
    }
 
    void load(istream& is) override
    {
        is >> m_top >> m_left >> m_size;
    }
private:
    double m_top;
    double m_left;
    double m_size;
};
 
int main()
{
    setlocale(0, "");
    
    vector<Shape*> arr =
    {
        new Square(1,2,3),
        new Square(4,5,6),
        new Square(7,8,9),
 
        new Rectangle(7,8,9),
        new Rectangle(4,5,6),
        new Rectangle(1,2,3)
    };
 
        ofstream ofs("file.txt", ios::trunc);
 
        for (auto s : arr)
        {
            s->save(ofs);
            delete s;
        }
    
    ifstream ifs("file.txt");
    vector<Shape*> new_arr;
 
    for (int id, flag=1;flag && ifs >> id;)
    {
        switch (id)
        {
        case Shape::square_t:
        case Shape::rectangle_t:
            new_arr.push_back(new Square());
            new_arr.push_back(new Rectangle());
            new_arr.back()->load(ifs);
            break;
            //...
        default:
            flag = 0;
        }
    }
 
    for (auto s : new_arr)
    {
        s->show(cout);
        delete s;
    }   
}

И выводит не те значения
Миниатюры
Запись в файл, чтение из файла, сохранени в файл, не работают эти функции  
0
07.07.2019, 21:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.07.2019, 21:41
Помогаю со студенческими работами здесь

Чтение из файла и запись в файл
Создайте текстовый файл целых чисел (значения вводятся с клавиатуры). Проанализировав в программе...

Чтение из файла/Запись в файл
Приветствую всех! Понимаю что тема заезженная вдоль и поперек, но помощь мне нужна срочно! Мне...

Запись в файл и чтение из файла
Здравствуйте!!! Как правильно сделать в с++ запись в файл и чтение из файла?? Объясните пожалуйста...

Запись в файл, чтение из файла
Каким образом можно реализовать чтение из файла только 1 строки,используя ifstream и fstream,если...


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

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