C++ работа с файлами (код писать не надо - нужна консультация)

Ответить
Дайне
Сообщения: 3
Зарегистрирован: 05 июн 2008, 13:36

05 июн 2008, 13:48

Доброе время суток. Прошу рассказать или дать ссылку где можно подробно почитать (желательно на русском) по ниже описаному вопросу:
Можно ли средствами С++ записать в файл не текстовую информацию и считывать ее потом тоже не как текст. Конкретно - есть необходимость загнать в файл некоторое количество векторов (одна программа), а потом их считывать(друграя программа).
Заранее спасибо.
Developer
Сообщения: 9
Зарегистрирован: 27 май 2008, 21:44
Откуда: Spb
Контактная информация:

05 июн 2008, 15:20

Да, конечно можно.

при открытии файла - fopen( FileName, "wb"); /* wb = Write Binary */
Затем писать в файл функцией

fwrite(Buf, size, count, F);
где
Buf - переменная, массив и тп
size - сколько байт писать( если к примеру пишем в файл int - лучше sizeof(int) писать тут)
count - то, сколько раз мы пишем блоки по size байт
F - файл, куда пишем

Для чтения - аналогично
fopen(FileName, "rb"); /* rb = ReadBinary */
fread(Buf, size, count, F); - всё аналогично
Дайне
Сообщения: 3
Зарегистрирован: 05 июн 2008, 13:36

05 июн 2008, 16:57

Спасибо.
Вопрос в продолжение - векторы имеют разный размер и я заранее не знаю какой размер у следующего. Тем более класс вектор на сколько я знаю хранит еще переменную отвечающую за размер (возможно и иные переменные, я еще не докопался) - как быть здесь?

Предположение: создаем пустой вектор, читаем первых 4 байта которые принимаются как размер N нашего вектора. Потом в цикле от 1 до N считываем по 4 байта отдельные числа и с помощью метода push_back() добавлять к нашему вектору.

Предположение, конечно, верное если считать что вектор записывается именно таким образом: размер элемент1 элемент2 элемент3 и т.д.

Но еще такой момент - мне понадобиться считывать вектора не попорядку, а например следующий за данным или предидущий, или через 3 вектора от данного.
Может в файл лучше записывать одномерные массивы одинакового большого размера, а потом считывать их элементы и методом push_back() добавлять к нашему вектору?
Developer
Сообщения: 9
Зарегистрирован: 27 май 2008, 21:44
Откуда: Spb
Контактная информация:

05 июн 2008, 18:12

Если указывается размер, то писать в файл так-
fwrite(Vek, size, 1, F);
Он запишет size байт, т.е. всю структуру. (Если я вас верно понял)

А насчет как лучше писать - это уже от программы зависит - ведь можно писать весь массив, прочитать в другой проге его и взять нужные элементы
Дайне
Сообщения: 3
Зарегистрирован: 05 июн 2008, 13:36

05 июн 2008, 18:27

Весь массив писать и потом считывать его будет не совсем симпатично - около 230k векторов каждый от 2 до 37 элементов типа integer. И держать такую громаду в оперативке нет желания)) тем более сама программа еще что-то делать будет.
Но я вроде разобрался что и куда "клеить". Спасибо!
Developer
Сообщения: 9
Зарегистрирован: 27 май 2008, 21:44
Откуда: Spb
Контактная информация:

05 июн 2008, 22:36

Хм - если нужен Nй элемент можно еще использовать fseek();
не помню порядка - но там надо
1)F - файл
2)Pos - позиция

Просто считываем размер следующего вектора и смещаемся на эту величину
и тп
GeorgeSoca
Сообщения: 0
Зарегистрирован: 12 окт 2015, 04:09
Откуда: Guam
Контактная информация:

12 окт 2015, 23:07

On our web, you can feel safe! Besides we use mirrored hard drives on all of our servers so we also take backup twice a day on separate servers. We use ISPmanager as the control panel. ISPmanager is a control panel that makes it easy to administer its Web site. With us you can place as many websites and domains you wish for a hosting account.
virtual hosting
Ответить