| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Сохранение в файл текущей задачи |
| Автор: Нитонисе 16.11.2011, 09:32 |
| Задача такая - нужно сохранить текущую работу в файл. Наподобие как в Word можно сохранить файл с набранным текстом. То есть на выходе должен получаться файл с зарезервированной иконкой и ассойиированный с моим приложениме. В последствии двойной клик в проводнике по этому файлу - и все его содержимое загружается в программу. Но вопрос не в том, как сделать иконку и установить ассоциативню связь с моим приложением, а в том как организовать хранение всех переменных в файле. В программе имеется множество полей, переключателей, таблиц. Как сделать своеобразный "снимок" текущей работы и записать все это в файл с тем чтобы в последствии из этого файла восстановить состояние всех полей, переключателей и таблиц? Для примера. Допустим есть такие управляющие элементы: "Поле для ввода А". "Поле для ввода Б". "Поле для ввода В". "Переключатель". "Таблица" (в таблице 5 колонок). Например в текущей работе такое состояние: Текст в поле А - "текстА". Текст в поле Б - "текстБ". Текст в поле В - "текстВ". Значение переключателя - true. В таблице 3 записи: первая запись - "1кол1,1кол2,1кол3,1кол4,1кол5" вторая запись - "2кол1,2кол2,2кол3,2кол4,2кол5" третья запись - "3кол1,3кол2,3кол3,3кол4,3кол5" Вот нужно все это записать в файл и затем загрузить из него, записав все значения полей, таблиц и запомнив состояние переключателя. |
| Автор: Данкинг 16.11.2011, 10:13 |
| Так выводи данные из контролов в в файл в определённом порядке. А затем - при обратной загрузке из файла - значение из соответствующей строчки подставляй соответствующему контролу. |
| Автор: vol4ek 16.11.2011, 11:36 |
| используй INI файл. WritePrivateProfileString() и GetPrivateProfileString() Добавлено через 25 секунд очень удобно |
| Автор: Данкинг 16.11.2011, 11:41 |
| Ну, тогда действительно INI-файл. Секция - переменная - значение. |
| Автор: kin 16.11.2011, 11:45 |
| Привет! На мой взгляд, все до безобразия просто: посмотри как организован проект у того же Buildera или VS. Это XML-файл (или что-то подобное) где каждый узел - это отдельный элемент твоей работы, атрибуты этого узла (или его дочерние узлы) - свойства элемента. Ну а в чем плюсы(минусы) такой конструкции разберешься сам. |
| Автор: vol4ek 16.11.2011, 11:48 |
| слишком мудрено. В INI указал нужный ключ и получил данные. А так можно и в реестр настройки совать. |
| Автор: Нитонисе 16.11.2011, 12:07 |
| ini вроде как выглядит неплохо, только я пока не разбирался в детальном принципе работы. Но тут есть вот еще какая заковыка. Файл должен быть с моим расширением. Например "файл.my". Как можно его обрабатывать как ini-файл? |
| Автор: vol4ek 16.11.2011, 12:17 | ||||
| запросто. любое расширение. Добавлено через 2 минуты и 24 секунды
Добавлено через 7 минут и 22 секунды одно уточнение.
если в последнем параметре указано имя файла без пути, по умолчанию файл создается в папке Windows. |
| Автор: kin 16.11.2011, 12:26 |
| Не спорю, все зависит от задачи. На мой взгляд, INI-файл хорошо работает, когда система плоская, а если есть иерархия тут, все же, XML сподручнее будет. |
| Автор: Нитонисе 16.11.2011, 12:35 |
| А как решить задачу хранения данных таблицы в ini? Когда есть набор статичных полей для записи или чекбоксы - то все понятно, каждому контролу - своя запись в ini. А в таблице может быть несколько строчек. Как организовать хранение табличных данных в ini? И еще, я так понял расширение могу давать файлу любое, но работать с ним как с ini и все будет ОК? |
| Автор: vol4ek 16.11.2011, 12:55 | ||
| будет ок. Какое расширение задано в функциях, с тем расширением и будет работать. хранение таблицы. Ну например так:
|
| Автор: Нитонисе 16.11.2011, 13:08 |
| Еще вопрос. Можно ли как-то зашифровать этот файл при записи? Чтобы его нельзя было просматривать например в блокноте. Соответственно перед считыванием информации - расшифровать. |
| Автор: vol4ek 16.11.2011, 13:20 |
| не скажу не знаю. файл текстовый, блокнотом просматривается, выглядеть будет так: [секция] ключ1 = значение ключ2 = значение [секция2] ключ1 = значение и т.д. если там будет хранится инфа которую нужно спрятать от чужих глаз, может стоит писать структуры в бинарный файл. Добавлено через 1 минуту и 1 секунду хотя мудрено. а что там у тебя лежать-то будет? |
| Автор: Нитонисе 16.11.2011, 13:25 |
| Обычный файл. В нем ничего секретного. Просто хочу лишить пользователя возможности править файл вручную, а то может что-то некорректно подправить. Например некое поле не может принимать значение больше 100. Пользователь в файле выставит 200 - вот и получится некорректный итог программы. |
| Автор: vol4ek 16.11.2011, 13:31 |
| дай файлу расширение системное com,exe,dll и спрячь куда нибудь в Windows\\system32 например. Не забудь указать путь в GetPrivateProfileString(). Создать свою папку можно так CreateDirectory("путь\\имя",NULL); |
| Автор: Данкинг 16.11.2011, 13:31 |
| Нитонисе, ещё извращённый способ: хранить настройки в .dbf. И таблица, и редактировать "простому смертному" не дано. |
| Автор: vol4ek 16.11.2011, 13:33 | ||
мы не ищем легких путей. |
| Автор: Нитонисе 16.11.2011, 13:51 | ||
Не, файл прятать не нужно. По сути файл - это проект пользователя. Как отдельный файл Word например. Этот файл можно передать другому пользователю и он может посмотреть работу первого пользователя. |
| Автор: Alca 16.11.2011, 14:08 |
| MDB |
| Автор: Данкинг 16.11.2011, 14:27 | ||
Вообще я бы так и сделал, особенно если сохраняемых настроек много. Добавлено через 33 секунды
Или даже так. |
| Автор: xvr 16.11.2011, 14:34 | ||||
Обойти форму (проперти Components и ComponentsCount кажется) и сбросить содержимое контролов (имя брать из проперти Name, а вот значение придется вытаскивать вручную для каждого типа контрола). Сбрасывать можно как в ini файл, так и в xml - как удобнее
Подписать файл. Например посчитать его MD5 и записать в конец |
| Автор: ZVano 24.11.2011, 10:28 | ||||||||
Можно воспользоваться BASE64 кодированием значений. API: CryptStringToBinary и CryptBinaryToString. У меня их вызовы обернуты в библиотеку. Не очень удачный вариант кода, но все же лучше чем ничего. myLib.h
myLib.cpp
Используем например так:
|
| Автор: XPyCT 25.11.2011, 08:48 |
| Все гораздо и гораздо проще. 1 создаешь структуру 2.Вектор 3. #include<stdio.h>, #include<vector> и сохраняешь и читаешь все что тебе нужно из вектора сохраняешь в бинарный файл расширение дат или какое тебе нужно лично читаю файлы на ура такого рода как приложен в аттаче |