Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Перемещение файлового указателя     




Метод Seek() изменяет положение файлового указателя — места, где находится следующий записываемый или считываемый фрагмент данных. Другими словами, методы Write() и Read()класса CFileработают с символами в позиции файлового указателя. Метод Seek() помещает файловый указатель в любое место файла. 

Обратите внимание на константуCFile:: beginв вызове методаSeek():

           InFile.Seek(20 * loop_index. CFile::begin);

Это означает, что файловый указатель должен переместиться в новую позицию, положение которой зодано относительно начала файла. Возможные точки отсчета задаются константами CFile::begin, CFile::current(для текущей позиции файла) и CFile::end.

 Теперь файловый указатель находится в нужном месте. Теперь можно считать 20 символов в подготовленный массив InString, воспользовавшись методом Read(). Данный метод возвращает количество фактически прочитанных символов, которое мы сохраняем в целой переменнойNumberCharacters:

void CFilerDlg::OnButton1()

{

   CFile OutFile("data.dat", CFile: :modeCreate | CFile: :modeWrite);

        for(int loop_index = 0; loop_index < 4; loop_index++){

                         OutFile.Write(OutString[loop_index], 20);

            }

        OutFile.Close();

 CFile InFile("data.dat", CFile::modeRead);

for(loop_index == 0; loop_index < 4; loop_index++){      

            InFile.Seek(20 * loop_index. CFile::begin); 

           int NumberCharacters == InFile.Read(InString, 20);

}

}

Мы последовательно прочитали все записи файла.

Учтите, что в приведенном выше примере метод Seek() используется исключительно для того, чтобы продемонстрировать деление файла на отдельные записи; это может быть очень полезно, если файл data.dat содержит, скажем, миллион и более записей. Но в нашем маленьком примере можно было бы прочитать все 80 символов из файла data.dat за один вызов Read () — следует лишь запросить 80 символов вместо 20.

ПОДСКАЗКА: Если точный размер файла неизвестен, запросите в методе Read() количество байт, заведомо превышающее объем файла — Read() возвратит количество фактически прочитанных байт, которое в данном случае совпадает с размером файла. Кроме того, можно читать файл по секциям, и если количество байт, прочитанных методом Read() окажется меньше запрошенного, вы достигли конца файла.

Прочитанная запись находится всимвольном массиве InString[ ].Остается лишь перенести содержимое всех записей во второетекстовое поле и закрыть файл data.dat

void CFilerDlg::OnButton1()

{

   CFile OutFile("data.dat", CFile: :modeCreate | CFile: :modeWrite);

        for(int loop_index = 0; loop_index < 4; loop_index++){

                         OutFile.Write(OutString[loop_index], 20);

            }

        OutFile.Close();

 CFile InFile("data.dat", CFile::modeRead);

for(loop_index == 0; loop.index < 4; loop„index++){      

            InFile.Seek(20 * loop_index. CFile::begin); 

           int NumberCharacters == InFile.Read(InString, 20);

   m_text2 += CString(InString);

}

            UpdateData(false);

           InFile.Close();

}

Программа готова к работе. Запустите ее. Текст, предназначенный для сохранения в четырех записях, содержится в верхнем текстовом поле.

Нажмите кнопку Прочесть и записать файл. Текст записывается в файл data.dat, а затем повторно считывается программой и выводится в нижнем текстовом поле.  

Работа с несколькими документами и видами

Сейчас мы обратимся к чрезвычайно сильному аспекту Visual С++ — одновременной работе с несколькими документами и с несколькими видами для документов. Это позволит открыть в программе сразу несколько документов (скажем. timetable.txt и phonenumbers.txt) и работать с ними так, как предусмотрено в приложении.

До сих пор нам не приходилось организовывать работу с несколькими документами в одной программе. Все программы, написанные до настоящего момента, намеренно делались однодокументными — это позволяло упростить программу и сосредоточиться на других аспектах программирования на Visual C++, однако пришло время для работы с несколькими документами в одной программе. Как мы вскоре увидим, разные документы отображаются в разных окнах внутри главного окна. Это называется многодокументным интерфейсом (MDI).

Программа на Visual C++ может автоматически создавать новые объекты для нестандартных классов документа и вида при каждом выполнении команды File >- New. Каждый документ обладает своим собственным объектом документа, что обеспечивает автоматическое отделение данных одного документа от других.

Мы также увидим, как обеспечить в программе отображение нескольких видов для каждого документа. Вид определяет внешнее представление данных: когда документ слишком велик, чтобы полностью поместиться на экране, вид отображает лишь некоторую его часть. Для одного документа можно открыть сразу несколько видов — каждый будет показывать отдельную часть главного документа. Пользуясь несколькими видами, пользователь может перемещаться по документу и одновременно работать с различными его частями. Каждый вид отображается в отдельном окне.

Раз пользователь получает возможность работать с различными видами одного документа, возникает новая проблема: что делать, если пользователь внес изменения в одном виде? Узнают ли о них остальные виды того же документа? Для программ, построенных с помощью AppWizard, ответ будет отрицательным — пользователь может просматривать один и тот же фрагмент документа в двух разных окнах и внести в одном из них изменения, которые не отобразятся в другом окне. Впрочем, мы узнаем, как справиться с этой проблемой.

Кроме того, поскольку при составлении программ нам придется иметь дело с большими документами, мы узнаем, как обеспечить работу полос прокрутки, расположенных вдоль сторон окна вида. С их помощью пользователь может плавно прокручивать содержимое документа.

Наконец, мы "накроем" целое окно вида текстовым полем, чтобы получить доступ к стандартным функциям редактирования Cut, Copy и Paste, а также встроенным полосам прокрутки.

Начнем с первой программы, работающей с несколькими документами и видами.










Последнее изменение этой страницы: 2018-04-12; просмотров: 291.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...