Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 5.00
alexei-evil
2 / 2 / 1
Регистрация: 12.06.2008
Сообщений: 38
#1

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

31.07.2011, 00:33. Просмотров 2918. Ответов 12
Метки нет (Все метки)

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

Создание/открытие файлов, чтение из файла и запись в файл через наследование - C++
Имеется следующая иерархия классов: Файл, Типизированный файл, Текстовый файл Методы: Создать/Открыть файл, Чение из файла, Запись в...

Запись и чтение из файла - C++
Всем добрый вечер, как можно записать данные в файл? Например записать в txt файл список паролей. На одном сайте нашел информацию по...

Запись и чтение из файла - C++
Не знаю как подойти. Список товаров, имеющихся на складе, включает в себя наименование товара, количество единиц товара, цену...

Запись и чтение с файла - C++
Подскажите пожалуйста как правильно записать массив в файл и считать его оттуда в другой массив? Если можно пример кода не в чистом с,а...

Чтение/запись файла - C++
Помогите написать 2 функции. 1-создает файл 2-Записывает в файл

Запись и чтение из файла - C++
Доброго время суток! Так от балди решыл набросать прогу которая создаёт файл записывает туда 11 рандомных чисел,потом з помощю ifstream я...

12
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
31.07.2011, 00:46 #2
http://www.boost.org/doc/libs/1_47_0/libs/serialization/doc/index.html
0
BAIZOR
0 / 0 / 0
Регистрация: 30.10.2010
Сообщений: 68
31.07.2011, 00:47 #3
Скажу сразу что я не профессионал, но я почти уверен что профессионал бы:
1)Для экономии памяти записывал бы в SAVE файл по байтово (тут описано как)
2) Для того что бы файл нельзя было читать в блокноте можна просто зашифровать его, но если выполнить первый пункт то шифровка уже не понадобиться.
Для шифрования достаточно было б просто просто напросто добавить в каждому записываемому символу +182 (к примеру, но это слишком просто, можна создать какойто динамичный алгоритм), а при считывании файла расшифровывать ( -182 от каждого символа).
0
alexei-evil
2 / 2 / 1
Регистрация: 12.06.2008
Сообщений: 38
31.07.2011, 00:59  [ТС] #4
Спасибо! Обмозгую. Правда не совсем понятна экономия памяти, если записывать числа побайтово. Например, число double - это 8 байт, то есть одно число будет записано в виде 64 символов (нулей и единичек). В чем экономия? Или я что-то не правильно понял?
0
Bers
Заблокирован
31.07.2011, 06:46 #5
для экономии можно заюзать зип.
А так - зная размер структуры, записывать структуру целиком, либо только значимые её поля
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
31.07.2011, 07:23 #6
Раз файл не нужно редактировать вручную (в блокноте), то хранить его нужно в бинарном виде. Это делает процесс записи/чтения банальным.
При помощи оператора << записываешь данные в поток в заданном порядке, при помощи >> считываешь их из потока в том же порядке.
Для сохранения массива сперва сохраняешь количество элементов.
Т.к. у тебя примитивные типы данных, то ты можешь обойтись без буст сериализации и прочих сложных слов. Просто сохраняй всё в файл в любом удобном тебе порядке.
Если хочется "защитить" файл от внешних изменений, можешь его зазиповать с шифрованием.
0
ValeryLaptev
Эксперт С++
1042 / 821 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
31.07.2011, 09:11 #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.
4
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
31.07.2011, 09:25 #8
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Это операция вывода для текстовых файлов
Да-да-да, туплю.) Недавно этот вопрос мне уже объяснили.)))
Вот что значит использовать буст-сериализацию.)
0
alexei-evil
2 / 2 / 1
Регистрация: 12.06.2008
Сообщений: 38
01.08.2011, 14:52  [ТС] #9
Всем спасибо за ответы!

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

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

Я забыл уточнить, что у меня не просто массив объектов, а вектор (vector)
Соответственно размер этого массива я заранее не знаю.
Вопрос: как узнать размер записанного в файл массива?
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.08.2011, 14:55 #10
запиши размер вектора в файл, а потом сначала читаешь размер, а дальше весь вектор
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.08.2011, 15:09 #11
Я же сказал.)
Цитата Сообщение от Deviaphan Посмотреть сообщение
Для сохранения массива сперва сохраняешь количество элементов.
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
01.08.2011, 15:14 #12
ну можно ещё преобразовать в указатель на char (static_cast<char*)(&file) и в бинарном режиме записать в файл, считывать так же потом.
0
alexei-evil
2 / 2 / 1
Регистрация: 12.06.2008
Сообщений: 38
02.08.2011, 21:44  [ТС] #13
Всем спасибо! Все получилоcь! И последний вопрос: Как сделать, чтобы ofstream и ifstream работали кириллицей в пути к файлу? Путь к файлу получаю через CFileDialog.
0
02.08.2011, 21:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2011, 21:44
Привет! Вот еще темы с ответами:

Запись и чтение из файла - C++
Здравствуйте не могли бы мне помочь разобраться, что не так. Есть две программы, одна для записи в файл “Writer.exe” а для чтения...

Чтение из файла и запись - C++
Доброго времени суток. Передо мной стоит следующая задача - имеется файл и строк слов такого типа: АААА ББББ ВВВВВ АААА ПППП АААА...

запись\чтение из файла - C++
У меня несколько вопросов по поводу запись\чтение из файла Как это вообще работает?) Чтобы потом читать из файла надо забивать каждое...

Чтение/запись файла - C++
Вот сделал такую прогу. Очень простая. Создает файл, где есть 100 полей. Каждое поле это строка из индекса, названия, кол-ва (например...


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

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

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