Форум программистов, компьютерный форум CyberForum.ru

Создание SAVE файла. Запись и чтение. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 5.00
alexei-evil
2 / 2 / 1
Регистрация: 12.06.2008
Сообщений: 38
31.07.2011, 00:33     Создание SAVE файла. Запись и чтение. #1
Доброго времени суток! Хочу обратиться за мудрым советом к профессионалам.
Мне необходимо реализовать в своем приложении создание SAVE файла. Запись и чтение из него.
У меня есть массив объектов. Скорее всего, количество объектов не будет больше ста. У каждого объекта есть шесть параметров - числа типа double, один параметр, который может принимать одно из четырех целочисленных значений (1, 3, 5 и 8) и несколько флагов. Мне необходимо реализовать сохранение информации об этих объектах в SAVE файл. И сделать это нужно грамотно. До этого я не особо сталкивался с такими задачами и, обычно, сохранял данные в виде текстового файла, где значения разделялись каким-нибудь символом, например пробелом. Но, я понимаю, что это не лучший вариант. Вот и хотелось бы узнать, как бы это сделал профессионал?
Реализация большого значения не имеет, разберусь с этим сам. Больше интересует сама структура такого файла. В каком виде сохранять данные? Как их правильно читать? При этом желательно, чтобы SAVE файл можно было открыть или изменить, только из моего приложения. И чтобы, открывая файл, например, через блокнот нельзя было что-то в нем прочитать.
Убедительная просьба, если вам не интересна эта тема, или вы слишком крутой, чтобы утруждать себя ответами на такие вопросы, то, пожалуйста, лучше не пишите ничего! Заранее благодарен!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2011, 00:33     Создание SAVE файла. Запись и чтение.
Посмотрите здесь:

Си, Запись и Чтение из файла. C++
C++ Запись и чтение из файла
C++ запись\чтение из файла
Чтение/запись файла C++
Запись и чтение из файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
31.07.2011, 00:46     Создание SAVE файла. Запись и чтение. #2
http://www.boost.org/doc/libs/1_47_0...doc/index.html
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
31.07.2011, 00:47     Создание SAVE файла. Запись и чтение. #3
Скажу сразу что я не профессионал, но я почти уверен что профессионал бы:
1)Для экономии памяти записывал бы в SAVE файл по байтово (тут описано как)
2) Для того что бы файл нельзя было читать в блокноте можна просто зашифровать его, но если выполнить первый пункт то шифровка уже не понадобиться.
Для шифрования достаточно было б просто просто напросто добавить в каждому записываемому символу +182 (к примеру, но это слишком просто, можна создать какойто динамичный алгоритм), а при считывании файла расшифровывать ( -182 от каждого символа).
alexei-evil
2 / 2 / 1
Регистрация: 12.06.2008
Сообщений: 38
31.07.2011, 00:59  [ТС]     Создание SAVE файла. Запись и чтение. #4
Спасибо! Обмозгую. Правда не совсем понятна экономия памяти, если записывать числа побайтово. Например, число double - это 8 байт, то есть одно число будет записано в виде 64 символов (нулей и единичек). В чем экономия? Или я что-то не правильно понял?
Bers
Заблокирован
31.07.2011, 06:46     Создание SAVE файла. Запись и чтение. #5
для экономии можно заюзать зип.
А так - зная размер структуры, записывать структуру целиком, либо только значимые её поля
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
31.07.2011, 07:23     Создание SAVE файла. Запись и чтение. #6
Раз файл не нужно редактировать вручную (в блокноте), то хранить его нужно в бинарном виде. Это делает процесс записи/чтения банальным.
При помощи оператора << записываешь данные в поток в заданном порядке, при помощи >> считываешь их из потока в том же порядке.
Для сохранения массива сперва сохраняешь количество элементов.
Т.к. у тебя примитивные типы данных, то ты можешь обойтись без буст сериализации и прочих сложных слов. Просто сохраняй всё в файл в любом удобном тебе порядке.
Если хочется "защитить" файл от внешних изменений, можешь его зазиповать с шифрованием.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
31.07.2011, 09:11     Создание SAVE файла. Запись и чтение. #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Deviaphan, вот только не надо использовать операцию << при выводе в двоичный файл.
Это операция вывода для текстовых файлов. Она по умолчанию делает преобразование из двоичного вида в текстовый.
Надо так:
C++
1
2
3
4
ofstream F("d:/f.ttt", ios::binary);
  double b = 1.0;
  F.write((char*)&b, sizeof(double));             // -- вывод 8 байтов --
  F.close();
Если вместо метода write() написать F << b, то выводится ОДИН байт.
Проверено в студии 2010.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
31.07.2011, 09:25     Создание SAVE файла. Запись и чтение. #8
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Это операция вывода для текстовых файлов
Да-да-да, туплю.) Недавно этот вопрос мне уже объяснили.)))
Вот что значит использовать буст-сериализацию.)
alexei-evil
2 / 2 / 1
Регистрация: 12.06.2008
Сообщений: 38
01.08.2011, 14:52  [ТС]     Создание SAVE файла. Запись и чтение. #9
Всем спасибо за ответы!

Добавлено через 16 часов 41 минуту
Друзья, у меня появился дополнительный вопрос!
С предыдущим разобрался, всем огромное спасибо!

Теперь возник дополнительный вопрос насчет чтения:

Я забыл уточнить, что у меня не просто массив объектов, а вектор (vector)
Соответственно размер этого массива я заранее не знаю.
Вопрос: как узнать размер записанного в файл массива?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.08.2011, 14:55     Создание SAVE файла. Запись и чтение. #10
запиши размер вектора в файл, а потом сначала читаешь размер, а дальше весь вектор
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.08.2011, 15:09     Создание SAVE файла. Запись и чтение. #11
Я же сказал.)
Цитата Сообщение от Deviaphan Посмотреть сообщение
Для сохранения массива сперва сохраняешь количество элементов.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
01.08.2011, 15:14     Создание SAVE файла. Запись и чтение. #12
ну можно ещё преобразовать в указатель на char (static_cast<char*)(&file) и в бинарном режиме записать в файл, считывать так же потом.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2011, 21:44     Создание SAVE файла. Запись и чтение.
Еще ссылки по теме:

Запись и чтение из файла C++
Чтение и запись из файла C++
C++ Запись и чтение из файла

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

Или воспользуйтесь поиском по форуму:
alexei-evil
2 / 2 / 1
Регистрация: 12.06.2008
Сообщений: 38
02.08.2011, 21:44  [ТС]     Создание SAVE файла. Запись и чтение. #13
Всем спасибо! Все получилоcь! И последний вопрос: Как сделать, чтобы ofstream и ifstream работали кириллицей в пути к файлу? Путь к файлу получаю через CFileDialog.
Yandex
Объявления
02.08.2011, 21:44     Создание SAVE файла. Запись и чтение.
Ответ Создать тему
Опции темы

Текущее время: 23:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru