Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
127 / 95 / 74
Регистрация: 18.01.2011
Сообщений: 227
1

Объект с двумя деками не выгружается с файла

07.02.2016, 01:00. Показов 460. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! У меня ситуация, что не получается загрузить содержимое файла в переменную prog. Запись в файл работает, а вот выгрузка нет (по ходу программы выбрасывает ошибку см 1.jpg). Раньше именно с такой ситуацией не сталкивался, точно не уверен как нужно записывать и считывать.

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
#include <vcl>
#include <deque>
#include <string.h>
#include <iostream.h>
#include <fstream.h>
#include <conio.h>
#include <iomanip.h>
 
const char *FName="file.txt";
 
class A{
    private:
       int id;
       char title[25];
    public:
       void input(int id, char *title)
       {
            this->id = id;
            strcpy(this->title, title);
       }
};
 
class B{
  private:
    char name[30];
    double rait;
  public:
    void input(char *name, double rait)
     {
          this->rait = rait;
          strcpy(this->name,name);
     }
};
 
class Arr{
    public:
       deque<A>mas1;
       deque<B>mas2;
 
       void AddMas1()
       {
           A tmp;
           tmp.input(15,"New String");
           this->mas1.push_back(tmp);
       }
 
       void AddMas2()
       {
           B tmp;
           tmp.input("Tomas Dubrowski",9.3);
           this->mas2.push_back(tmp);
       }
};
 
 
void SaveFile(Arr fl)
{
      ofstream f(FName,ios::binary|ios::out);
         f.write((char*)&fl,sizeof fl);
      f.close();
}
 
void LoadFile(Arr fl)
{
      ifstream in(FName,ios::binary|ios::in);
         in.read((char*)&fl,sizeof fl);
      in.close();
}
 
 
void main()
{
    Arr prog;
 
    prog.AddMas1();//Добавление тестовой записи1
    prog.AddMas2();//Добавление тестовой записи2
    SaveFile(prog);//Запись в файл
 
    LoadFile(prog);//Выгрузка из файла
    getch();
}
В классе Arr должны быть два дека (чтобы использовать как динамические списки). Убедительная просьба, отпишитесь ТОЛЬКО те, у кого есть дельное предложение для решения данной проблемы. Используемая среда: C++ Builder. Архив с проектом приложен.
Миниатюры
Объект с двумя деками не выгружается с файла  
Вложения
Тип файла: rar KFile.rar (479.8 Кб, 1 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.02.2016, 01:00
Ответы с готовыми решениями:

Нужны программы с деками и с заданием
Нужны программы с деками и с заданием,можна что бы присутствовали оператор варианта)

Ошибка при работе с деками
Я написал программу про игру пьяница.В игре в пьяницу карточная колода раздается поровну двум...

Как создать объект класса с двумя параметрами?
#include &lt;iostream&gt; using namespace std; class rational{ public: rational(int...

Как заставить объект мигать двумя цветами?
Всем привет! Подскажите пожалуйста скрипт, который заставит мигать объект с определенным классом. ...

8
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
07.02.2016, 01:05 2
romcka-x, может стоило привести тот участок кода на который указала ошибка, или хотя бы не закрывать его окном....
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
07.02.2016, 01:07 3
romcka-x, у вас откровенная глупость. С чего вы взяли что запись/чтение контейнеров из файла в файл - простая вещь?
Вы можете записать и прочитать указатель на данные без последствий?
Почитайте про сериализацию.
0
127 / 95 / 74
Регистрация: 18.01.2011
Сообщений: 227
07.02.2016, 01:22  [ТС] 4
Цитата Сообщение от _Valera_ Посмотреть сообщение
romcka-x, может стоило привести тот участок кода на который указала ошибка, или хотя бы не закрывать его окном....
Приложил более видный вариант
Цитата Сообщение от castaway Посмотреть сообщение
romcka-x, у вас откровенная глупость. С чего вы взяли что запись/чтение контейнеров из файла в файл - простая вещь?
Я написал выше, что не сталкивался с подобным вводом/выводом в файл. Это просто мое предположение
Миниатюры
Объект с двумя деками не выгружается с файла  
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
07.02.2016, 01:31 5
Цитата Сообщение от romcka-x Посмотреть сообщение
Я написал выше, что не сталкивался с подобным вводом/выводом в файл. Это просто мое предположение
Тем не менее так хранить данные нельзя. Как я писал выше:
Цитата Сообщение от castaway Посмотреть сообщение
Почитайте про сериализацию.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
07.02.2016, 01:32 6
Цитата Сообщение от romcka-x Посмотреть сообщение
Я написал выше, что не сталкивался с подобным вводом/выводом в файл. Это просто мое предположение
Суть в том, что ты пишешь память под объектами deque, а не данные, которые они хранят.
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
07.02.2016, 01:45 7
Ораторы выше уже все сказали, но попробую перевести, как я понял. Пусть есть массив интов - простой объект, один кусок памяти, примитивные типы. Ты его сериализуешь в файл побайтово. Потом читаешь побайтово в другую область памяти и кастишь указатель на начало области как массив интов. И все хорошо до тех пор, пока на машине где читаешь не будет другой порядок литл/биг эндиан. А уж если в сериализуемой структуре были указатели - тогда запоминать их бессмысленное и гиблое дело - они ничем не помогут при чтении.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
07.02.2016, 02:34 8
Если по-простому (без итераторов и алгоритмов):
Кликните здесь для просмотра всего текста
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
const char *FName="file.txt";
 
class A{
   
       int id;
       char title[25];
     public:
       void input(int id, char *title)
       {
            this->id = id;
            strcpy(this->title, title);
       }
 
     void output()
     {
        cout << id << ' ' << title << endl;
     }
};
 
class B{
  public:
    char name[30];
    double rait;
  
     void input(char *name, double rait)
     {
          this->rait = rait;
          strcpy(this->name,name);
     }
 
     void output()
     {
        cout << name << ' ' << rait << endl;
     }
};
 
class Arr{
    
       deque<A>mas1;
       deque<B>mas2;
 public:
       void AddMas1()
       {
           A tmp;
           tmp.input(15,"New String");
           this->mas1.push_back(tmp);
       }
 
       void AddMas2()
       {
           B tmp;
           tmp.input("Tomas Dubrowski",9.3);
           this->mas2.push_back(tmp);
       }
       
       void show()
       {
           for (size_t i = 0; i < mas1.size(); ++i)
               mas1[i].output();
           for (size_t i = 0; i < mas2.size(); ++i)
               mas2[i].output();
       }
       friend void SaveFile(const Arr& fl);
       friend bool LoadFile(Arr& fl);
};
 
 
void SaveFile(const Arr& fl)
{
      ofstream f(FName,ios::binary|ios::out);
      
      size_t s1 = fl.mas1.size(); 
      f.write((const char*)&s1, sizeof size_t);
      for (size_t i = 0; i < fl.mas1.size(); ++i)
          f.write((const char*)&fl.mas1[i], sizeof(fl.mas1[0]));
      
      size_t s2 = fl.mas2.size();
      f.write((const char*)&s2, sizeof size_t);
      for (size_t i = 0; i < fl.mas2.size(); ++i)
          f.write((const char*)&fl.mas2[i], sizeof(fl.mas2[0]));
      
      f.close();
}
 
bool LoadFile(Arr& fl)
{
      ifstream in(FName,ios::binary|ios::in);
      if (in)
      {
          size_t s1;
          in.read((char*)&s1, sizeof size_t);
          fl.mas1.resize(s1);
          for (size_t i = 0; i < fl.mas1.size(); ++i)
              in.read((char*)&fl.mas1[i], sizeof(fl.mas1[0]));
          
          size_t s2;
          in.read((char*)&s2, sizeof size_t);
          fl.mas2.resize(s2);
          for (size_t i = 0; i < fl.mas2.size(); ++i)
              in.read((char*)&fl.mas2[i], sizeof(fl.mas2[0]));
          
          in.close();
          return true;
      }
      return false;
}
 
 
int main()
{
    Arr prog;
 
    prog.AddMas1();//Добавление тестовой записи1
    prog.AddMas2();//Добавление тестовой записи2
    
    SaveFile(prog);//Запись в файл
    
    Arr prog2;
    if (LoadFile(prog2))//Выгрузка из файла
         prog2.show();
    else
        cout << "Error opening file!" << endl;
    
    
    getch();
}
1
127 / 95 / 74
Регистрация: 18.01.2011
Сообщений: 227
07.02.2016, 10:08  [ТС] 9
Цитата Сообщение от nd2 Посмотреть сообщение
Если по-простому (без итераторов и алгоритмов)
Круто! Спасибо, работает! Буду стараться теперь внедрять в проект
0
07.02.2016, 10:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.02.2016, 10:08
Помогаю со студенческими работами здесь

Как вставить новый объект между двумя соседними?
Здравствуйте! Имеется объект следующей структуры: var Obj = { { ...

Создать класс с двумя отдельными счетчиками и объект этого класса
Создать класс с двумя отдельными счетчиками и объект этого класса. Создать несколько одинаковых...

Существует ли в Visual Studio стандартный класс для работы с деками?
У меня возник такой вопрос. Существует ли в Visual Studio стандартный класс для работы с деками? На...

Не выгружается изображение из БД
Здравствуйте! Вновь прошу помощи у знающих! Загружаю изображение в БД(все нормально). При выгрузке...

Не выгружается представление
Наша организация работает на БД Oracle. Сервер БД - в Москве. Рабочие места - по всей России....

Программа не выгружается из процессов
Начинаю изучать OpenGL, но вот проблема (сижу в VS 2010): void Display() { ... } void...


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

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