Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ввод-вывод из файла хитрой структуры, необходимо сохранить структуру в файл 
V
    Опции темы
dengalf
Дата 10.4.2009, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 10.4.2009

Репутация: нет
Всего: нет



Доброго времени суток.
С++ занимаюсь недавно и исключительно по мере необходимости. Не программист короче.
Вопрос сформулирую так:
Программа создает структуру
struct syst {
int razm;
int dp0;
vector <bool> resh_syst;
vector < vector < vector <int> > > left_syst;
vector <bool> right_syst;
vector < vector <bool> > p0;
vector <int> vp0;
vector < vector <bool> > p1;
vector <int> vp1;
vector <bool> otvet;
}; с кучей значений.
и плюс vector < vector <bool> > morg очень большой длины(2 в 500 положим степени). Остальные vector ы также не маленькие. При этом, к текстовому файлу могут одновременно обращаться 10-30 компов.
Как, с каким синтаксисом, удобнее организовать вывод в файл и как его впоследствии считать.
PM MAIL   Вверх
zim22
Дата 10.4.2009, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(dengalf @  10.4.2009,  10:42 Найти цитируемый пост)
Как, с каким синтаксисом, удобнее организовать вывод в файл и как его впоследствии считать.

считывать как я понял вы потом опять в структуру будете? т.е. вам нужно временное хранилище внутреннего состояние структуры?
если да - то в PHP есть сериализация. возможно в С++ есть аналогичные библиотеки.


--------------------
PM MAIL   Вверх
dengalf
Дата 10.4.2009, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 10.4.2009

Репутация: нет
Всего: нет



примерно так. 
Если быть точнее - первые 5 строк структуры будут загоняться только один раз(кстати пришла мысль разделить структуру на две части). А вот все остальное - постоянно изменяется.
новый вариант на три файла: 
первый для
struct syst {
int razm;
int dp0;
vector <bool> resh_syst;
vector < vector < vector <int> > > left_syst;
vector <bool> right_syst;
}

второй

struct pop{
vector < vector <bool> > p0;
vector <int> vp0;
vector < vector <bool> > p1;
vector <int> vp1;
}
третий
< vector <bool> > morg

вот так наверное будет лучше

Это сообщение отредактировал(а) dengalf - 10.4.2009, 11:22
PM MAIL   Вверх
zim22
Дата 10.4.2009, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



dengalf, если бы у вас была структура без классов (без vector), то её можно было тупо записывать в бинарный файл примерно так:
Код

FILE *f = fopen("output.txt", "wb");
struct my_struct { int x; double y; char c[50]; }
my_struct m;
fwrite(f, (char*)&m, sizeof(my_struct));


а читать так:
Код

FILE *f = fopen("output.txt", "rb");
struct my_struct { int x; double y; char c[50]; }
my_struct m;
fread(f, (char*)&m, sizeof(my_struct));


Но вектор вы зачем-то используете, значит массивы динамические. и записывать структуру за "один присест" не получится уже.
Можно внутрь файла  записывать информацию, в которой будет указан размер вектора. Т.е. чтобы программа знала начиная откуда ей считывать данные.
***
Есть ещё паттерн проектирования Memento (Хранитель)
Он позволяет, не нарушая инкапсуляции, получить и сохранить во внешней памяти внутреннее состояние объекта, чтобы позже объект можно было восстановить точно в таком же состоянии.

Это сообщение отредактировал(а) zim22 - 10.4.2009, 11:26


--------------------
PM MAIL   Вверх
dengalf
Дата 10.4.2009, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 10.4.2009

Репутация: нет
Всего: нет



Вектор нужен.
собственно
int razm;
int dp0;
и говорит о размерности первый - о размерности внутренних булевых векторов, второй - о размерности p0, p1,  vp1 b vp0 (пока приемлемо, что они задаются один раз. Но это пока). morg - однозначно в динамике.

а вот первая структура вкидывается один раз. В принце, главное сейчас реализовать именно ее.
PM MAIL   Вверх
zim22
Дата 10.4.2009, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



давайте для начала пример попроще рассмотрим. запишем в файл и потом считаем первое поле(размер)
Код

#include <vector>
#include <fstream>

struct syst {  
    int razm;
    vector<int> vi;
  };
  syst s;
  s.vi.push_back(10);
  s.vi.push_back(20);
  s.vi.push_back(30);

  s.razm = s.vi.size();

  ofstream out("output.txt", ios::binary);
  out.write((char*)&s.razm, sizeof(int));
  out.close();
  out.clear();

  syst s2;
  ifstream in("output.txt", ios::binary);
  in.read((char*)&s2.razm, sizeof(int));
  in.close();
  in.clear();


******
Пример № 2 smile
Запишем и потом прочитаем не только размер, но и вектор!  smile 
Код

#include <vector>
#include <fstream>

using namespace std;

int main()
{
  
  struct syst {  
    int razm;
    vector<int> vi;
  };
  syst s;
  s.vi.push_back(10);
  s.vi.push_back(20);
  s.vi.push_back(30);

  s.razm = s.vi.size();

  ofstream out("output.txt", ios::binary);
  out.write((char*)&s.razm, sizeof(int));
  out.write((char*)&s.vi.front(), s.vi.size() * sizeof(int));
  out.close();
  out.clear();

  syst s2;
  
  ifstream in("output.txt", ios::binary);
  in.read((char*)&s2.razm, sizeof(int));
  
  s2.vi.resize(s2.razm);
  
  in.read((char*)&s2.vi.front(), s2.vi.size() * sizeof(int));
  in.close();
  in.clear();



    return 0;
}




Это сообщение отредактировал(а) zim22 - 10.4.2009, 11:56


--------------------
PM MAIL   Вверх
dengalf
Дата 10.4.2009, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 10.4.2009

Репутация: нет
Всего: нет



Ну вот, это уже поближе к народу. А то я после "паттерн проектирования " уже испарятся отсюда хотел smile 
А чуток откоментить, если не сложно. Я откровенно говоря это малость не так себе рисовал.

Собственно перед реализуемой прогой стоит след. цель:
Есть задача, есть алгоритм решения. Необходимо оценить его качество при куче разных параметров. Алгоритм работает, дело стоит за статистикой. А чтоб ее собрать, необходимо сформировать довольно специфические условия(что требует много времени и ресурсов smile ), записать их и потом на них тестить алгоритм до талого. Проблема сейчас стоит только в записать - прочитать.

Это сообщение отредактировал(а) dengalf - 10.4.2009, 12:21
PM MAIL   Вверх
xvr
Дата 10.4.2009, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(dengalf @ 10.4.2009,  10:42)
Программа создает структуру
struct syst {
int razm;
int dp0;
vector <bool> resh_syst;
vector < vector < vector <int> > > left_syst;
vector <bool> right_syst;
vector < vector <bool> > p0;
vector <int> vp0;
vector < vector <bool> > p1;
vector <int> vp1;
vector <bool> otvet;
}; с кучей значений.
и плюс vector < vector <bool> > morg очень большой длины(2 в 500 положим степени). 

Сколько сколько ?  smile 
2 ** 500 битов (пусть будет максимально плотно), это 2 ** 497 байтов, что составляет ( 2 ** 40)  ** 457 или (1Тб) ** 457. Я затрудняюсь сказать, сколько это будет в винчестерах по 1Тб (2 ** 457 штук или около 10 ** 137), что составляет более 10 ** 100 объемов Земли (что то мне кажется, что даже в Галактику не поместится)
Цитата

Остальные vector ы также не маленькие. При этом, к текстовому файлу могут одновременно обращаться 10-30 компов.
Только База Данных. 
Цитата

Как, с каким синтаксисом, удобнее организовать вывод в файл и как его впоследствии считать.
С веревкой и мылом, ТАКИЕ объемы в текстовых файлах не хранят

PM MAIL   Вверх
dengalf
Дата 11.4.2009, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 10.4.2009

Репутация: нет
Всего: нет



Цитата

10 ** 100 объемов Земли

Да, видать малость перегнул.  smile 
Я тут переосмыслил. Ладно, размер векторов пусть будет, положим тысяч 10-20, про доступ с других машин пока тоже забудем. 

Оставим только ввод-выводъ
struct syst {
int razm;
int dp0;
vector <bool> resh_syst;
vector < vector < vector <int> > > left_syst;
vector <bool> right_syst;
}
 
Собственно техническая работа в самом начале, до конечного результата есть разбег в год-два, а вот на промежуточный итог крайне скорость требуется...

Приношу глубочайшие за сырой вопрос.
PM MAIL   Вверх
zim22
Дата 11.4.2009, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(dengalf @  11.4.2009,  08:54 Найти цитируемый пост)
Приношу глубочайшие за сырой вопрос.

если у вас вопросов больше нет - пометьте тему решённой.


--------------------
PM MAIL   Вверх
dengalf
Дата 12.4.2009, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 10.4.2009

Репутация: нет
Всего: нет



Нет, вопрос таки остался - как всеж организовать ввод-вывод вот такой структуры:
struct syst {
int razm;
int dp0;
vector <bool> resh_syst;
vector < vector < vector <int> > > left_syst;
vector <bool> right_syst;
}
Мне больше ничего пока не надо.
PM MAIL   Вверх
zim22
Дата 12.4.2009, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(dengalf @  12.4.2009,  14:59 Найти цитируемый пост)
Нет, вопрос таки остался - как всеж организовать ввод-вывод вот такой структуры:

Я вам привёл пример. Для вашей структуры всё будет выглядеть почти аналогично. Если вы хотите готовый код - вам в Центр Помощи.



--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0763 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.