Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение переменных в файл. Помогите дописать диплом!! Запарился (( 
:(
    Опции темы
Achillius
Дата 28.3.2006, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подскажите ешё пожалуйста, как мне сохранить переменные в файл так, чтобы потом можно было не писать все занова, а просто открыть этот файл и все поля бы были заполнены старыми данными. В общем суть такая. Есть 7 диалоговых окон с данными, которые заполняет пользователь частично, а остальное считается автоматически. Каждому EditBox и ListBox присвоены свои переменные. Какждое окно имеет свой индивидуальный класс. Названия многих переменных в разных классах разных окон совпадают. Есть кнопки "вперёд" и "назад". При переходе в новое окно старое закрываю OnOK(). Может, окно просто надо прятать?? А семь спрятанных окон это не слишком?? как-то некрасиво. Когда я перехожу в новое модальное диалоговие окно, все переменные в старом почему-то обнуляются, а мне хотелось бы, чтобы при возврате назад значения были бы те, что пользоваетель тольео что ввел. У каждого окна есть функция OnInitDialog(), которая задаёт некоторые значения переменных (начальные) и инициализуется в конструкторе. Некоторые - но не все. Она работает корректно, но обнуляются сами переменные, т.е. при попытке EditBox присвоить значение переменной и сделать UpdateData(FALSE) все равно получается ноль. В чем проблема подскажите.
А ешё, как мне сделать так, чтобы эти переменные после сохранения в файл и закрытия программы можно было бы считать и заполнить ими поля, чтобы не вводить все занова.
Даже если подскажите направление движение мысли, буду оч. благодарен. Спасибо.
PM MAIL   Вверх
Kostt
Дата 28.3.2006, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 8.1.2006
Где: Томск

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



Цитата(Achillius @ 28.3.2006, 17:07)
А семь спрятанных окон это не слишком?? как-то некрасиво. Когда я перехожу в новое модальное диалоговие окно, все переменные в старом почему-то обнуляются, а мне хотелось бы, чтобы при возврате назад значения были бы те, что пользоваетель тольео что ввел.

Воспользуйся CTabCtrl
PM MAIL   Вверх
Earnest
Дата 28.3.2006, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(Achillius @ 28.3.2006, 17:07 Найти цитируемый пост)
Есть кнопки "вперёд" и "назад". При переходе в новое окно старое закрываю OnOK(). Может, окно просто надо прятать?? А семь спрятанных окон это не слишком?? как-то некрасиво. Когда я перехожу в новое модальное диалоговие окно, все переменные в старом почему-то обнуляются, а мне хотелось бы, чтобы при возврате назад значения были бы те, что пользоваетель тольео что ввел.

Если я правильно тебя поняла - не надо городить отсебятину со всеми этими окнами. Ровно то самое делает СPropertySheet в режиме Wizard.
Все свои переменные собери в структуру(ы), которые и будешь писать\читать из файла. При создании диалога (страниц) копируй элементы структуры во внутренние переменные окон, по закрытию окна - копируй обратно. Все остальное на DODataEchange (обмен между переменными и контролами).
Можно, вместо копирования переменных, просто передать ссылку на структуру данных в диалог и работать с переменными прямо - это если не нужна возможность восстановить данные после прохождения нескольких окон (например, если пользователь в 5-м окне нажал Cancel).



--------------------
...
PM   Вверх
Achillius
Дата 1.4.2006, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Earnest @ 28.3.2006, 18:17)
Все свои переменные собери в структуру(ы), которые и будешь писать\читать из файла. При создании диалога (страниц) копируй элементы структуры во внутренние переменные окон, по закрытию окна - копируй обратно. Все остальное на DODataEchange (обмен между переменными и контролами).
Можно, вместо копирования переменных, просто передать ссылку на структуру данных в диалог и работать с переменными прямо - это если не нужна возможность восстановить данные после прохождения нескольких окон (например, если пользователь в 5-м окне нажал Cancel).

Earnest, если я тебя правильно понял, то есть команда, которая может сразу целиком записывать структуру в файл и потом целиком её оттуда считывать. Или как. Что мне даст объединение в структуры?? Если есть такая команда , то подскажи, пожалуйста. Или это все как-то осуществляется с помощью File.Read() и File.Write()?? smile
PM MAIL   Вверх
En_t_end
Дата 1.4.2006, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Achillius
smile Зачем ? структура, это не класс.
Просто берем и пишем WriteFile(....вставляем ссылку на структуру, и её sizeof.)
Главное не забыть про #pragma pack
PM MAIL ICQ Skype GTalk Jabber   Вверх
Dreamer_0x01
Дата 1.4.2006, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Цитата

Главное не забыть про #pragma pack


В точку сказано! ;) Прочем, рано или поздно это все равно на своем опыте придется узнать ;) Особенно если предполагается запись/чтение данных разными программами.

Цитата

Что мне даст объединение в структуры??


Удобство. Чтобы все твои переменные читать не поэлементно, а поблочно.




--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Achillius
Дата 2.4.2006, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Блин, хорошо вам, когда вы все команды знаете. а у меня ни фига ни в книгах нет, ни в нете толково не найду. Это я про операции с файлами: как открыть, как закрыть, как в нужую позицию установить, как записать в файл и прочее.. Просил же пример... Я, блин, новичек тупой. Ну, не тупой, может, но новичек в этом деле, а написать диплом надо...
PM MAIL   Вверх
DeadSoul
Дата 2.4.2006, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Achillius @ 2.4.2006, 22:59 Найти цитируемый пост)
Это я про операции с файлами: как открыть, как закрыть, как в нужую позицию установить, как записать в файл и прочее

CFile или CStdioFile. Описание искать на msdn.microsoft.com или в MSDN-е установленном на твоем компе.


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Dreamer_0x01
Дата 3.4.2006, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Цитата

про операции с файлами: как открыть, как закрыть, как в нужую позицию установить, как записать в файл и прочее..

Ну раз уж в ветк MFC пишем, то о CFile и будем говорить.

А нужно-то для работы всего несколько методов этого класса - Open(),Close(),Read(),Write(), ну и для этапа изучения вполне хватит. описания этих методов в MSDN уж на столько простые и ясные, что даже мне с отсутствием знания английского этого вполне хватило.


Цитата(Achillius @ 2.4.2006, 22:59 Найти цитируемый пост)
Просил же пример... Я, блин, новичек тупой. Ну, не тупой, может, но новичек в этом деле, а написать диплом надо...


А за вас никто диплом писать и не собирается. Вот на конкретные вопросы с удовольствием ответим. А пока что вопросы строятся на уровне "я хочу все уметь,что мне делать?"



Это сообщение отредактировал(а) Dreamer_0x01 - 3.4.2006, 01:03


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Achillius
Дата 3.4.2006, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за подсказки. Я даже и не знал, что в нете есть сайт MSDN. С функциями разобрался, это было легко, т.к. английский я знаю хорошо. Только теперь вопрос возник такой... Пишу текст:

CFile cf;
cf.Open("test.txt",CFile::modeCreate | CFile::modeReadWrite );
cf.Write(&m_11_11,sizeof(m_11_11));
cf.Close();

Переменная m_11_11 типа float, которая берёт значение одного из EditBox. Так вот в файл только записываются какие-то закарючки вместо цифр (например ±рG вместо 123123). Почему??

Это сообщение отредактировал(а) Achillius - 3.4.2006, 12:37
PM MAIL   Вверх
Dreamer_0x01
Дата 3.4.2006, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



а все праавильно. Числа типа float представляются блоком байт (четырех, если память не изменяет).
Когда вы в каком-то редаторе смотрите содержание файла, то каждый байт представляется в виде символа.
однако, при прочтениии похожей командой этих данных из файла,
Код

cf.Read(&m_11_11,sizeof(m_11_11));

эти четыре байта будут снова считаны и преобразованы в единый блок, который будет соотвтествовать вашему записанному числу.
Так что ошибки тут нет.

Другой вопрос в том, что если вы хотите видеть записанные числа в "явном" виде
, то вам придется сначала преобразовать число в строку, а только после этого записывать ее в файл.

То есть нечто такое:
Код

CString str;
str.Format("%f",m_11_11);
cf.Write(str,str.GetLenth());


НО!!! читать в этом случае вы тоже должны будите именно строку, и потом приобразовывать ее в число!

Так что выбирайте - либо наглядность данных в вашем файле, либо удобство их чтения/записи.




--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
takedo
Дата 3.4.2006, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Так что выбирайте - либо наглядность данных в вашем файле, либо удобство их чтения/записи.

можно данные для работы писать в бинарник, а для посмотреть - в тектовый... Все довольны.


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Dreamer_0x01
Дата 3.4.2006, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Цитата

можно данные для работы писать в бинарник, а для посмотреть - в тектовый...


Ну на самом деле я и "посмореть" предпочитаю в бинарнике, в шестнадцатеричном редакторе, привычка ;)


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Achillius
Дата 4.4.2006, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот этого я и боялся... Все верно, числа записываются и читаются корректно, проверял. А боялся я, что каждое число надо будет преобразовывать в строку. Мне надо просто все эти числа потом сделать в txt-файл нормальный, т.к. его надо будет распечатывать. Есть какая-нть команда, чтобы этот корявый файл с переменными сразу в текстовый перевести одной командой, а??? или прийдётся везде в строки каждый раз делать? Я сдохну, у меня там переменных больше трёх сотен smile Как это попроще сделать-то, блин?.. smile
PM MAIL   Вверх
Dreamer_0x01
Дата 6.4.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Цитата(Achillius @ 4.4.2006, 19:27 Найти цитируемый пост)
Я сдохну, у меня там переменных больше трёх сотен

Спокойствие. От этого еще никто не умирал ;)

Цитата(Achillius @ 4.4.2006, 19:27 Найти цитируемый пост)
Как это попроще сделать-то, блин?

Нужно изначально продумывать такие вещи, а не после того, как программа написана.
А вообще...Не вижу в этом чего-то особенно сложного. Переменные наверняка каким-то образом объединены в какие-то логические блоки. Вот в цикле по каждому такому "блоку" и делаем преобразования. А если у вас ВСЕ переменные одного типа, как вы указали, float - то вообще в ОДНОМ ЕДИНСТВЕННОМ цикле одна и та же команда способна их все "конвертировать" в текстовый формат.



--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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