Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Сохранение переменных в файл.


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

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

Воспользуйся CTabCtrl

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

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

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

Earnest, если я тебя правильно понял, то есть команда, которая может сразу целиком записывать структуру в файл и потом целиком её оттуда считывать. Или как. Что мне даст объединение в структуры?? Если есть такая команда , то подскажи, пожалуйста. Или это все как-то осуществляется с помощью File.Read() и File.Write()?? smile

Автор: En_t_end 1.4.2006, 16:52
Achillius
smile Зачем ? структура, это не класс.
Просто берем и пишем WriteFile(....вставляем ссылку на структуру, и её sizeof.)
Главное не забыть про #pragma pack

Автор: Dreamer_0x01 1.4.2006, 18:03
Цитата

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


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

Цитата

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


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


Автор: Achillius 2.4.2006, 22:59
Блин, хорошо вам, когда вы все команды знаете. а у меня ни фига ни в книгах нет, ни в нете толково не найду. Это я про операции с файлами: как открыть, как закрыть, как в нужую позицию установить, как записать в файл и прочее.. Просил же пример... Я, блин, новичек тупой. Ну, не тупой, может, но новичек в этом деле, а написать диплом надо...

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

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

Автор: Dreamer_0x01 3.4.2006, 01:01
Цитата

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

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

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


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


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


Автор: Achillius 3.4.2006, 12:35
Спасибо за подсказки. Я даже и не знал, что в нете есть сайт 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). Почему??

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

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

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

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

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

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


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

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


Автор: takedo 3.4.2006, 14:59
Цитата

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

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

Автор: Dreamer_0x01 3.4.2006, 15:08
Цитата

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


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

Автор: Achillius 4.4.2006, 19:27
Вот этого я и боялся... Все верно, числа записываются и читаются корректно, проверял. А боялся я, что каждое число надо будет преобразовывать в строку. Мне надо просто все эти числа потом сделать в txt-файл нормальный, т.к. его надо будет распечатывать. Есть какая-нть команда, чтобы этот корявый файл с переменными сразу в текстовый перевести одной командой, а??? или прийдётся везде в строки каждый раз делать? Я сдохну, у меня там переменных больше трёх сотен smile Как это попроще сделать-то, блин?.. smile

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

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

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

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

Автор: heavyduty 9.10.2007, 08:12
Здравствуйте!
Такой вот вопрос, если сказано, что надо сохранить полученные данные от пользователя, при нажатиии на OK, надо создавать файл?
Спасибо

Автор: Greeen 9.10.2007, 15:08
Надо

Автор: it_medved 17.10.2007, 09:20
Вот пример записи переменной int в бинарный файл:
Код

void CSaveToFileDlg::OnBnClickedOk()
{
    UpdateData(TRUE);
    CString m_strFilePath;//Переменная для хранения значения расположения файла
    CFileDialog dlg(FALSE);
    if(dlg.DoModal() == IDOK)
    {
        m_strFilePath = dlg.GetPathName();
        CFile file(m_strFilePath,CFile::modeReadWrite | CFile::modeCreate);
        CArchive m_ar(&file,CFile::modeReadWrite | CFile::modeCreate);
        m_ar<<m_iMember;//Запись переменной в двоичный файл
        m_ar.Close();
        file.Close();
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)