Лекция 7 Кафедра Прикладной математики М-703, тел. 362-79-62 К.т.н., профессор Глаголев Виктор Борисович, комн. Ж-405б, тел. 362-73-28

Презентация:



Advertisements
Похожие презентации
Файловый тип данных Turbo Pascal Операции для работы с файлами 11 класс.
Advertisements

Файловый тип данных Файл – это область памяти на внешнем носителе, в которой хранится некоторая информация. В языке Паскаль файл представляет собой последовательность.
Множества значений или переменных с одним общим именем называются структурированными типами. По способу организации и типу компонентов выделяют: 1. Массивы.
Текстовые файлы Вербицкая Ольга Владимировна, Заозерная школа 16.
Текстовые файлы в VBA. Чтобы начать работу с файлом, его необходимо открыть: Open For As # Имя файла – строка, указывающая полный путь к файлу Режим –
Файл это поименованная область диска. Чтобы записать информацию в файл надо проделать следующие операции 1.Открыть файл 2.Вывести данные в файл 3.Закрыть.
Тип данных файл 1 курс. План: 1.Понятие типа данных файл. Дескриптор файла. 2.Классификация файлов в Паскале. 3.Структура описания типа данных файл. 4.Действия.
Файловая переменная. Файл – совокупность данных, записанная во внешней памяти под определенным именем. Любой файл имеет три характерные особенности: уникальное.
Работа с файлами Сазонов Д.О. ПМиЭММ Часть 2. Тема занятия: Работа с файлами через потоки Для реализации файлового ввода/вывода, необходимо включить в.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
Программирование типовых алгоритмов вычислений Информатика.
1 Файловый тип данных Файл – это область памяти на внешнем носителе, в которой хранится некоторая информация. Файл – это набор данных, хранящихся во внешней.
Глава 9. ВВОД-ВЫВОД ДАННЫХ И ФАЙЛОВАЯ СТРУКТУРА Логический и физический файлы Типы файловой переменной Общие процедуры работы с файлами Текстовые файлы.
«Типы данных». Целочисленные типы данных Тип ДиапазонТребуемая память (байт) byte shortint integer word longint
План-конспект урока (информатика и икт, 9 класс) по теме: Переменные:тип, имя, значение
1 Программирование на языке Паскаль Тема: Файлы. Integer, Real, Boolean, Character, String, Text.
Массивы 9 класс. Основные теоретические сведения Примеры решения задач.
Работа с файлами.. Процедура Assign(var f; name : String); Связывает внешний файл с именем name и переменную файлового типа f. Все дальнейшие операции.
Одномерный массив. Цель урока: познакомить учащихся с понятием одномерный массив Задачи: дать определение массива дать представление: об описании массива.
Процедуры и функции. Разработал учитель информатики МБОУ СОШ 50 г. Краснодара Ракута Елизавета Григорьевна « Учиться и, когда придет время, прикладывать.
Транксрипт:

Лекция 7 Кафедра Прикладной математики М-703, тел К.т.н., профессор Глаголев Виктор Борисович, комн. Ж-405б, тел Файлы Введение Структуры Номер файла Открытие и закрытие Запись и чтение Блокирование файла Вспомогательные функции и методы Примеры

Файлы Архитектура современных компьютеров предусматривает наличие оперативной и внешней памяти. В оперативной памяти находятся выполняемая в данный момент программа и обрабатываемые данные. Объем оперативной памяти ограничен, ее стоимость относительно высока, информация не сохраняется при выключении питания компьютера – все это не позволяют ее применять для постоянного хранения больших объемов информации.

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

Под файлом понимается именованная часть внешней памяти, предназначенная для хранения совокупность данных. Файл состоит из записей. Запись характеризуется длиной, выраженной в байтах. Запись состоит из данных, которые передаются между оперативной и внешней памятью за одну операцию чтения или записи данных.

Чтение данных – это передача данных из внешней памяти в оперативную память. Запись данных – это передача данных из оперативной памяти во внешнюю память. Любое приложение, связанное с необходимостью хранения и обработки значительных объемов данных, неизбежно вынуждено хранить эти данные в файлах, а значит и с записью данных в файл и чтением их из файла.

VB поддерживает три вида файлов: файлы с последовательным доступом, файлы с произвольным доступом, двоичные файлы. Файлы с последовательным доступом – это текстовые файлы, которые можно открывать с помощью текстового редактора. Текстовый файл может содержать коды символов, признак перевода строки vbCrLf, признак табуляции vbTab и признак конца файла.

Записи файла с последовательным доступом – это строки переменной длины, отделенные друг от друга символом перевода строки. Такие файлы обычно создаются приложениями для обработки и хранения текстовой информации (но не числовой). Файлы с последовательным доступом читаются от начала к концу, поэтому невозможно одновременно и считывать из них данные, и записывать таковые. Обычно информация из текстового файла считывается вся в память и сохраняется вся в файле после окончания работы с ней.

Если же приложению требуется частый доступ к данным, хранящимся в некотором файле, следует использовать файлы с произвольным доступом. В файлах с произвольным доступом как и в файлах с последовательным доступом, текстовые данные хранятся в виде символов, по два байта на символ. Однако числа хранятся в своем естественном формате (как Integer, Double, Single и т. д.).

Файлы с произвольным доступом в любой момент позволяют обработать любую запись. В предыдущих версиях VB требовалось, чтобы длина всех записей файла произвольного доступа была одинакова. В VB.NET записи файла произвольного доступа могут иметь разную длину. В этом случае информация о длине записи содержится в самой записи.

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

Все внешние устройства позволяют использовать последовательный доступ к записям файла. Произвольный доступ позволяют использовать только магнитные и оптические диски. Процесс работы с файлом почти не зависит от его типа и условно делится на этапы: Получение номера свободного канала ввода- вывода (номера файла). Применяется функция FreeFile().

Открытие файла. Операционная система резервирует некоторое количество памяти для хранения данных файла. Если файл открывается для записи и он не существует, то он создается, а затем открывается. Для открытия файла (при необходимости и для его создания) используется функция FileOpen(). Чтение или запись данных. Файл может быть открыт для чтения, для записи или для чтения и записи. Данные считываются, обрабатываются, а затем снова сохраняются в том же или другом файле.

Закрытие файла. Когда файл закрывается, операционная система освобождает занимаемую им оперативную память. Для выполнения этой операции используется функция FileClose(). В следующих разделах будут рассмотрены некоторые функции VB, используемые для обработки файлов. С полным перечнем этих функций можно ознакомиться с помощью справочной системы VB.

Структуры Кроме встроенных типов данных, таких как Integer, Long и т.п., VB поддерживает также типы данных, определяемые пользователем. Они могут быть созданы как на основе базовых типов данных, так и на основе типов ранее определенных пользователем.

Для определения пользовательского типа (структуры) данных используется ключевое слово Structure : Structure Имя_типа Dim Элемент1 [([Размерность])] As Тип Dim Элемент2 [([Размерность])] As Тип. End Structure Структура не может быть объявлена внутри процедуры. Она может быть объявлена до первой процедуры формы или модуля.

Определив собственный тип данных, его можно использовать для объявления переменных этого типа. Эти переменные могут быть локальными, переменными области формы или модуля или глобальными. Переменную пользовательского типа называют записью. Отдельные компоненты этой переменной называют полями записи.

Переменная пользовательского типа является структурированной. Она подобно массиву включает в свой состав отдельные элементы, но в отличие от массива, ее элементы могут иметь разный тип: Structure Товар Dim Название As String Dim Цена As Decimal Dim Код As Long End Structure

Dim Инструмент As Товар Private Sub Button1_Click(). Инструмент.Название = _ "Отвертка" Инструмент.Цена = 120. End Sub

В этом примере в до первой процедуры формы определяется тип данных Товар. Затем на уровне формы объявляется переменная Инструмент типа Товар, а конкретные значения составляющих этой переменной устанавливаются в процедуре Buttonl_Click. Доступ к элементам переменной пользовательского типа осуществляется, по аналогии с доступом к свойствам, путем указания точки после имени переменной.

Переменные одинакового типа можно присваивать не поэлементно, а напрямую: Structure Субъект Dim Фамилия_и_Инициалы As _ String Dim ТабельныйНомер As Integer End Structure Dim Читатель, Пользователь As _ Субъект

Private Sub Button1_Click() Пользователь.Фамилия_и_Инициалы = _ "Иванов И.И." Пользователь.ТабельныйНомер = Читатель = Пользователь End Sub Переменные Читатель и Пользователь относятся к одному типу Субъект. Поэтому они присваиваться напрямую, а не поэлементно.

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

Номер файла Каждому открытому файлу система VB ставит в соответствие канал ввода-вывода с определенным номером. При выполнении операции ввода и вывода имеет значение не имя файла, а номер связанного с ним канала. Номер свободного канала, который можно использовать для работы с файлом может быть получен с помощью функции FreeFile() : FreeFile (RangeNumber)

Необязательный параметр RangeNumber может принимать значение 0 (по умолчанию) и 1. Если его значение равно 0, то возвращается номер канала из диапазона 1– 255, если 1, то из диапазона 256 – 511. Пример. n = FreeFile()

Открытие и закрытие файла Чтобы иметь возможность использовать файл, его нужно открыть или создать и открыть, если он еще не существует. Функция FileOpen(), выполняющая эту операцию, принимает множество аргументов, из которых обязательными являются только первые три. FileOpen(number, path, mode [, access][, share][, recordLen])

В аргументе number задается номер файла, предварительно полученный с помощью функции FreeFile(). В аргументе path задается путь к открываемому файлу. Аргумент mode определяет режим открытия файла и может содержать одно из значений, перечисленных в таблице на следующих слайдах.

ЗначениеОписание OpenMode.Input Файл открывается только для чтения данных из файла, начиная с первой записи OpenMode.Output Файл открывается только для записи данных в файл, начиная с первой записи OpenMode.Append Файл открывается для добавления новых данных после последней записи Все эти три режима характерны для файлов с последовательным доступом.

ЗначениеОписание OpenMode.Random Файл открывается для произвольного доступа (чтения и записи, по одной записи за раз) OpenMode.Binary Файл открывается как двоичный Режим Random предназначен для файлов с произвольным доступом, а Binary – для двоичных файлов.

В файле с последовательным доступом изменять отдельные элементы данных нельзя. Можно либо прочитать их (а при желании и сохранить в другом файле), либо записать новые данные. При необходимости получить данные из такого файла нужно открыть его в режиме Input, считать данные и закрыть файл. Для перезаписи данных нужно снова открыть этот файл, на этот раз в режиме Output, и сохранить в нем новые данные.

Если Вы хотите просто добавить в существующий файл данные (не меняя существующие), откройте файл в режиме Append. В случае открытия файла с последовательным доступом в режиме Output VB сотрет его содержимое, даже если Вы ничего в него не запишете. Более того, VB не станет предупреждать Вас о своем намерении стереть файл.

Необязательный аргумент access определяет, следует ли открыть файл для чтения ( Read ), записи ( Write ) или и чтения, и записи ( ReadWrite ). Если открыть файл с опцией Read, программа не сможет модифицировать его даже по ошибке. Данный аргумент не имеет никакой связи с типом файла. Файлы с последовательным доступом можно открывать лишь с опциями Read и Write, поскольку их можно либо только записывать, либо только считывать.

Аргумент access предназначен исключительно для защиты данных от случайного изменения. Если Вам нужно прочитать данные из файла, откройте его с опцией Read, что позволит исключить риск их изменения.

Аргумент share определяет права других приложений Windows на то время, пока ваше приложение держит файл открытым. В Windows может выполняться множество приложений одновременно, и не исключено, что какое-нибудь из них попытается открыть уже открытый файл. Поэтому имеет смысл указать, может ли другое приложение открывать данный файл и в каком режиме. Допустимые значения аргумента share приведены в таблице.

ЗначениеОписание OpenShare.Shared Другие приложения могут работать с этим файлом OpenShare.LockRead Файл заблокирован для чтения OpenShare.LockWrite Файл заблокирован для записи OpenShare.LockReadWrite Файл не доступен для других приложений

Открыв для работы файл с произвольным доступом, можно задать в последнем аргументе recordLen длину записи в байтах. В этом случае VB не будет сохраняет в файле информацию о длине отдельных записей.

Длина записи равна сумме байтов, занимаемых всеми ее полями. Вы можете вычислить ее либо самостоятельно, либо вызвав функцию Len(record). В аргументе record этой функции задается имя структуры, используемой для создания записей файла с произвольным доступом.

Пример Dim n As Integer = FreeFile() FileOpen(n, "c:\t\f.dat", _ OpenMode.Random, OpenAccess.Write,,256)

Функция FileClose(file_number) Функция FileClose() закрывает файл, номер которого передан ей в качестве аргумента. Так, следующая инструкция закрывает файл с номером n1 : FileClose(n1)

Запись в файл и чтение из файла PrintLine(file_number, output_list) Функция PrintLine() записывает данные в файл с последовательным доступом. В ее первом аргументе задается номер файла, в который производится запись, а второй аргумент – записываемые значения. Аргумент output_list представляет собой массив параметров, через который функции можно передать любое количество значений.

PrintLine(n, v1, v2, "Петров", ) Если в файл записывается несколько значений, они разделяются запятыми. Каждая такая запятая указывает, что очередной элемент списка будет записываться в следующей зоне записи. Зоне записи соответствуют 14 позиций. Если записываемое значение не помещается в зоне записи, то длина зоны записи будет последовательно увеличена на 14 позиций, пока ее длины не хватит.

Функция LineInput(file_number) Для чтения очередной записи данных из файла с последовательным доступом используется функция LineInput(). В аргументе file_number ей передается номер уже открытого файла.

Символ, разделяющий строки, не включается в результирующие данные. Приведенный ниже код прочитает две очередные записи файла и присвоит их строковым переменным st1 и st2 : st1 = LineInput(n) st2 = LineInput(n)

FilePut(file_number, value[, record_number]), FileGet(file_number, value[, record_number]) Эти функции используются для записи и чтения записей из файла с произвольным доступом. Каждой из них может быть передан номер записи, с которой Вы хотите работать.

В аргументе record_number задается номер записи, а в аргументе value – переменная, содержащая записываемую в файл запись или принимающая запись, которая считывается из файла. Аргумент record_number не обязателен; если он не задан, будет записываться или считываться текущая запись.

После записи или чтения очередной записи текущей становится следующая запись. Таким образом, вызвав функцию FilePut() десять раз подряд без указания номера записи, Вы последовательно создадите или перезапишете первые десять записей файла с произвольным доступом. Точно так же, вызвав десять раз подряд функцию FileGet() без указания номера записи, Вы последовательно прочитаете первые десять записей файла.

Несколько слов о принципах обработки файлов с произвольным доступом. Предположим, Вы хотите создать файл с произвольным доступом для хранения списка товаров. Информация о каждом из товаров содержится в структуре Товар, определяемой следующим образом: Structure Товар Dim Код As String Dim Название As String Dim Цена As Decimal End Structure

Структура Товар будет использоваться для хранения информации о товаре. Начнем с объявления переменой типа Товар : Dim Тов As Товар

Теперь можно присвоить значения полям структуры Тов : Тов.Код = "TV00180-A" Тов.Название = "SONY Trinitron" Тов.Цена = Для записи данных, хранящихся в переменной Тов, в файл с произвольным доступом, мы воспользуемся функцией FilePut().

fn = FreeFile() FileOpen(fn, _ "c:\products.dat",OpenMode.Random) Последний аргумент, в котором задается длина записи, здесь опущен. Записи содержат строки (название товара), следовательно, имеют переменную длину, так что пусть ими занимается функция FileOpen. Информация о длине каждой строки хранится вместе с самой строкой, так что определять длину каждой записи не понадобится.

Далее переменная Тов записывается в файл с помощью инструкции: FilePut(fn, Тов) Обратите внимание, что номер записи, в которой сохраняются данные, не указан. Вы можете изменить значения полей переменной Тов и сохранить в файле следующую запись с помощью точно такой же инструкции. После записи всех необходимых данных файл закрывается с помощью инструкции FileClose(fn).

Для того чтобы прочитать данные из файла, нужно открыть его с применением той же функции FileOpen(), с помощью которой мы открывали его для записи данных: fn = FreeFile() FileOpen(fn, "c:\products.dat", _ OpenMode.Random) Затем обычно выполняется цикл чтения записей.

Следующий фрагмент кода демонстрирует, как записать в файл с произвольным доступом записи разной длины с помощью функции FilePut() и как их прочитать с помощью функции FileGet().

Прежде всего, добавим следующее объявление структуры до первой процедуры формы : Structure Товар Dim Код As String Dim Название As String Dim Цена As Decimal End Structure Затем поместим в форму кнопку и введем в обработчике ее события Click такие инструкции:

Dim Тов As Товар Тов.Код = "TV00180-A" Тов.Название = "SONY Trinitron" Тов.Цена = fn = FreeFile() FileOpen(fn, "c:\products.dat", OpenMode.Random) FilePut(fn, Тов) Тов.Код = "TV-RCA" Тов.Название = "This is an RCA Trinitron TV" Тов.Цена = FilePut(fn, Тов)

Тов.Код = "TV810X" Тов.Название = "Real cheap BIG Trinitron TV" Тов.Цена = FilePut(fn, Тов) FileClose(fn) fn = FreeFile() FileOpen(fn, "c:\products.dat", OpenMode.Random) FileGet(fn, Тов, 2) FileClose(fn) TextBox1.AppendText(Тов.Код & _ Тов.Название & Тов.Цена)

Коды и описания различных товаров представляют собой строки разной длины. Первая часть приведенного кода записывает три записи в файл с произвольным доступом и закрывает его. Вторая часть кода считывает из файла вторую запись и выводит ее поля в текстовом поле TextBox1.

Итак, функции FilePut() и FileGet() позволяют работать записями, которые имеют переменную длину. Эти функции берут на себя ответственность за работу с такими записями, предоставляя Вам доступ к данным файлов с произвольным доступом и используя запись в качестве базовой единицы длины.

Функция Seek Seek(file_number[, position]) Функция Seek() возвращает текущую позицию указателя ввода-вывода в заданном файле, если она вызвана без аргумента position. Задав в функции Seek() аргумент position, можно установить текущую позицию ввода/вывода. Например, для того чтобы в файле с произвольным доступом перейти к началу третьей записи, нужно выполнить такую инструкцию: Seek(fNum, 3)

Блокирование файла Lock(file_number[, fromRecord][, toRecord]), Unlock(file_number[, fromRecord][, toRecord]) Функция Lock() позволяет заблокировать файл или его отдельные записи в файле с произвольным доступом. Заблокированные записи не доступны другим приложениям. Однако Ваше приложение имеет доступ ко всему файлу. Если другое приложение попытается открыть заблокированный файл или получить доступ к заблокированной записи, VB сгенерирует для него исключение.

Если необязательные аргументы не заданы, файл блокируется целиком. Но если задан аргумент fromRecord, блокируются все записи до конца файла, начиная с указанной записи. В случае же применения обоих необязательных аргументов будет заблокирован диапазон записей. Функция Unlock() выполняет операцию, противоположную выполняемой функцией Lock(), то есть снимает установленную ею блокировку.

Функции EOF и LOF EOF(file_number), LOF(file_number) Эти две функции используются при работе с файлами постоянно. Функция EOF() принимает в качестве аргумента номер открытого файла и возвращает True, если достигнут его конец ( EOF ). Функция EOF() часто используется в циклах для определения момента достижения конца файла. Функция LOF() возвращает выраженную в байтах длину файла, номер которого передан ей в качестве аргумента.

Dim s, T As String Dim fn As Integer fn = FreeFile() FileOpen(fn, c:\ReadMe.txt, _ OpenMode.Input) Do Until EOF(fn) s = LineInput(fn) T = T & s & vbCrLf Loop

В этом коде инструкция LineInput выполняется в цикле, пока не будет достигнут конец файла. Функция EOF ( End Of File ) возвращает значение True при достижении конца файла. При этом на каждом шаге цикла считывается отдельная строка и к ней добавляется символ конца строки, который отбрасывает инструкция LineInput.

Пример. Исследование функции Rnd Для генерации случайных величин применяется функция Rnd(). Эта функция возвращает случайное число типа Single, удовлетворяющее условию 0 a < 1.

Проверим, насколько близка эта случайная величина, получаемая с помощью функции Rnd(), к известной в теории вероятностей случайной величине, имеющей равномерное распределение на отрезке (0,1)?

Важнейшими числовыми характеристиками случайной величины является ее математическое ожидание (среднее) и среднее квадратичное отклонение (СКО) – мера разброса относительно среднего значения. Для равномерно распределенной на отрезке 0 – 1 случайной величины теория вероятностей дает значения ее математического ожидания и СКО: Математическое ожидание = 0,5 СКО = 0,

Имея возможность с помощью функции Rnd() получить множество реализаций случайной величины, можно вычислить экспериментальную оценку ее математического ожидания (оно же среднее значение) и оценку СКО. Для этого следует применить формулы, известные в математической статистике:

Для решения поставленной задачи следует предусмотреть генерацию с помощью функции Rnd() достаточного большого числа случайных величин и запись их в файл последовательного доступа, а также извлечение их значений из файла с целью выполнения вычислений экспериментальных оценок по формулам, приведенным на предыдущем слайде.

Результаты выполнения проекта:

Можно заметить, что экспериментальные оценки математического ожидания и СКО довольно близки к теоретическим значениям. Следовательно, имеется основание считать случайную величину, возвращаемую функцией Rnd(), распределенной равномерно на отрезке (0,1).