Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774

Как правильно считать и записать в файл

10.02.2016, 14:22. Показов 1815. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот такие вот классы, как правильно записать, а затем считать из файла
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
class Base
{
public:
    Base(string s=""):name(s){}
    virtual void Print()const { cout << name; }
    virtual ~Base() = 0;
private:
    string name;
};
class Derived:public Base
{
public:
    Derived(string s1 = "", string s2 = "") :Base(s1), type(s2) {}
    void Print()const { Base::Print(); cout << type; }
private:
    string type;
};
 
int main()
{
    Base*ob = new Derived("sobaka", "pydel");
    ofstream o("file.bin");
    o.write((char*)ob, sizeof(Tovar*));
 
 
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.02.2016, 14:22
Ответы с готовыми решениями:

Как правильно записать строки в файл и считать их?
Имеется ввиду следующее: Открывается приложение а позже это приложение должно открытся с теми же размерами что и последний...

Как правильно считать/записать файл в ANSI кодировке?
Есть текстовой файл с ANSI кодировкой, английскими и русскими словами. Хочу в консольном приложении считать каждую 5-ю строку из этого...

Как правильно считать (записать) структуру из файла?
не хочет правильно читать, вроде пишет, вроде правильно, не уверен. Заранее благодарен за помощь void __fastcall...

14
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
10.02.2016, 14:28
anti-k, классы и структуры, содержащие в себе указатели, могут записаться и считаться некорректно.
0
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
10.02.2016, 14:30  [ТС]
Kerry_Jr, Что делать? Писать по строчке? Интересно к стати как себя поведет указатель на таблицу в.ф при записи и считывании. Повторюсь, как быть?
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
10.02.2016, 14:34
anti-k, нужно конкретно именно объект записать в файл, или проще записать в него данные, а затем в программе считывать их в объект?
1
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
10.02.2016, 15:30  [ТС]
Kerry_Jr, Ситуация такая, каких то особых требований нету, читаем по строчке из файла, делаем объект(к стати интересно ваше мнение, делать ли фабрику в этом случае), затем визитор сливает объект в контейнер с указателями на базовый класс. Здесь нужно слить эти контейнеры в файл, с последующей возможностью считывания. Свой полный "феерический" код, по понятным причинам . Хотелось бы разобраться хотя бы с данной моделью.

Добавлено через 45 минут
Как бэ вот так сработало, но если сделать деструктор Base чисто виртуальным, компиляции всячески противится.
Как бэ намекает на неразрешенный символ
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
class Base
{
public:
    Base(string s=""):name(s){}
    virtual void Print()const { cout << name; }
    virtual ~Base() {};
private:
    string name;
};
class Derived:public Base
{
public:
    Derived(string s1 = "", string s2 = "") :Base(s1), type(s2) {}
    void Print()const { Base::Print(); cout << type; }
private:
    string type;
};
 
int main()
{
    Base*ob = new Derived("sobaka", "pydel");
    ofstream o("file.bin");
    o.write((char*)ob, sizeof(Tovar*));
    ifstream fs("file.bin");
    Base*ob1=nullptr;
    fs.read(reinterpret_cast<char*>(&ob1),sizeof(Base));
    ob->Print();
    system("pause");
}
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
10.02.2016, 15:35
Цитата Сообщение от anti-k Посмотреть сообщение
но если сделать деструктор Base чисто виртуальным, компиляции всячески противится.
Наверное, потому что чисто виртуальный должен быть переопределен в потомке.
1
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
10.02.2016, 15:39  [ТС]
Kerry_Jr, М
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Наверное, потому что чисто виртуальный должен быть переопределен в потомке.
Мое почтение, спасибо!
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
10.02.2016, 16:56
Цитата Сообщение от anti-k Посмотреть сообщение
Как бэ вот так сработало,
Так ни в коем случае нельзя делать.
1
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
10.02.2016, 17:00  [ТС]
DrOffset, Мое почтение, как надо? Вы 100% в курсе, подскажите пожалуйста.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
10.02.2016, 17:10
Лучший ответ Сообщение было отмечено anti-k как решение

Решение

Цитата Сообщение от anti-k Посмотреть сообщение
Мое почтение, как надо?
Меня очень удивляет, что тебе самому это не очевидно.
Минимальный переделанный вариант:
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
class Base
{
public:
    Base(string s=""):name(s){}
    virtual void save(std::ostream & out) const
    {
        out << name;
    }
    virtual void load(std::istream & in)
    {
        in >> name;
    }
    virtual ~Base() {}
private:
    string name;
};
 
class Derived
    :public Base
{
public:
    Derived(string s1 = "", string s2 = "")
        :Base(s1), type(s2)
    {}
 
    void save(std::ostream & out) const
    {
        Base::save(out);
        out << type;
    }
    void load(std::istream & in)
    {
        Base::load(in);
        in >> type;
    }
private:
    string type;
};
 
 
int main()
{
    Base * ob = new Derived("sobaka", "pydel");
    ofstream o("file.bin");
    ob->save(o);
    o.close();
 
    ifstream fs("file.bin");
    Base * lb = new Derived();
    lb->load(fs);
 
    lb->save(std::cout);
}
1
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
10.02.2016, 17:59  [ТС]
DrOffset,
Цитата Сообщение от DrOffset Посмотреть сообщение
Меня очень удивляет, что тебе самому это не очевидно.

Не по теме:

дело в том что я длительное время тренировал лень и недоумство, результат превзошел все ожидания


Выходит работать следует только построчно, с самим объектом так себя вести небезопасно?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
10.02.2016, 17:59
anti-k, ты ошибки-то осознал, или так, просто на веру мой пост принял?
0
10.02.2016, 18:00  [ТС]

Не по теме:

хотел еще поблагодарить, ваши посты и подсказки мне в самом деле очень помогают

0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
10.02.2016, 18:02
Цитата Сообщение от anti-k Посмотреть сообщение
с самим объектом так себя вести небезопасно?
Дампом памяти сохранять можно только "цельные" (без внешних ресурсов) объекты POD типов. Но и в этом случае есть нюансы. Такие как
1) выравнивание
2) порядок байт
Ключевые слова гуглятся.

Цитата Сообщение от anti-k Посмотреть сообщение
только построчно
Копирование сложных объектов в С++ почленное (а не дампом), следовательно и сохранение\загрузка должны быть такие же.
Читай про сериализацию.
0
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
10.02.2016, 18:16  [ТС]
DrOffset,
Цитата Сообщение от DrOffset Посмотреть сообщение
ты ошибки-то осознал, или так, просто на веру мой пост принял?

Не по теме:

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


В принципе понятно, но надо еще почитать
Цитата Сообщение от DrOffset Посмотреть сообщение
1) выравнивание
2) порядок байт
Ключевые слова гуглятся.
и
Цитата Сообщение от DrOffset Посмотреть сообщение
Читай про сериализацию.
спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.02.2016, 18:16
Помогаю со студенческими работами здесь

Как считать и записать в файл?
Доброго времени суток. Вопрос вот в чем. Реализую md5 алгоритм шифрования и финальным штрихом является считывание из файла незашифрованного...

Как правильно считать Excel файл?
Добрый день, подскажите, пожалуйста, как правильно считать данные из Excel. Прикладываю код программы, не выводятся текстовые данные. Еще...

Как считать/записать из/в файл Excel?
Здравствуйте. Решил разобраться со считыванием из файла xls(x) и соответственно записью в него. Причём нужна &quot;корректная&quot;...

Как правильно считать побайтово файл в массив
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;cstdlib&gt; #include &lt;time.h&gt; #include &lt;string&gt; using namespace std; int...

Как записать Md5 в файл и потом считать
Всем доброго времени суток, у меня такой вопрос у меня есть файл я получаю его MD5 как мне этот результат записать в отдельный файл под...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru