Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
1

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

10.02.2016, 14:22. Просмотров 1284. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.02.2016, 14:22
Ответы с готовыми решениями:

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

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

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

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

14
Эксперт PHP
2687 / 2351 / 1099
Регистрация: 14.05.2014
Сообщений: 6,714
Записей в блоге: 1
10.02.2016, 14:28 2
anti-k, классы и структуры, содержащие в себе указатели, могут записаться и считаться некорректно.
0
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
10.02.2016, 14:30  [ТС] 3
Kerry_Jr, Что делать? Писать по строчке? Интересно к стати как себя поведет указатель на таблицу в.ф при записи и считывании. Повторюсь, как быть?
0
Эксперт PHP
2687 / 2351 / 1099
Регистрация: 14.05.2014
Сообщений: 6,714
Записей в блоге: 1
10.02.2016, 14:34 4
anti-k, нужно конкретно именно объект записать в файл, или проще записать в него данные, а затем в программе считывать их в объект?
1
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
10.02.2016, 15:30  [ТС] 5
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
2687 / 2351 / 1099
Регистрация: 14.05.2014
Сообщений: 6,714
Записей в блоге: 1
10.02.2016, 15:35 6
Цитата Сообщение от anti-k Посмотреть сообщение
но если сделать деструктор Base чисто виртуальным, компиляции всячески противится.
Наверное, потому что чисто виртуальный должен быть переопределен в потомке.
1
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
10.02.2016, 15:39  [ТС] 7
Kerry_Jr, М
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Наверное, потому что чисто виртуальный должен быть переопределен в потомке.
Мое почтение, спасибо!
0
13474 / 7137 / 1712
Регистрация: 30.01.2014
Сообщений: 11,936
10.02.2016, 16:56 8
Цитата Сообщение от anti-k Посмотреть сообщение
Как бэ вот так сработало,
Так ни в коем случае нельзя делать.
1
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
10.02.2016, 17:00  [ТС] 9
DrOffset, Мое почтение, как надо? Вы 100% в курсе, подскажите пожалуйста.
0
13474 / 7137 / 1712
Регистрация: 30.01.2014
Сообщений: 11,936
10.02.2016, 17:10 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
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
10.02.2016, 17:59  [ТС] 11
DrOffset,
Цитата Сообщение от DrOffset Посмотреть сообщение
Меня очень удивляет, что тебе самому это не очевидно.

Не по теме:

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


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

Не по теме:

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

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

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

Не по теме:

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


В принципе понятно, но надо еще почитать
Цитата Сообщение от DrOffset Посмотреть сообщение
1) выравнивание
2) порядок байт
Ключевые слова гуглятся.
и
Цитата Сообщение от DrOffset Посмотреть сообщение
Читай про сериализацию.
спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.02.2016, 18:16

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.