Что такое внешний файл
Аннотация: В пятой лекции рассказывается о работе с файлами, их классификации и операторах open, inquire, rewind, backspace, close. Рассматривается асинхронный файловый ввод/вывод и возможности контроля таких операций с помощью программы Intel Inspector XE. Лекция заканчивается обзором стандартных процедур для работы с файлами из модуля ifport.
Вы можете скачать презентацию к данной лекции здесь.
Назначение файлов
Обмен данными с другими программами
Внешние и внутренние файлы
Внешний файл - именновання область на внешнем носителе.
D:\DATA\results.txt
E:\geometry.dat
Внутренний файл – символьная строка или массив.
character(100) buffer
characrer(1000) temp(10)
Файловые записи
Запись – единица обмена данными между программой и внешней памятью.
Расположены в файле последовательно.
Форматные записи внутреннее → внешнее представление
Неформатные записи внутреннее представление
Запись конец файла последняя запись в файле.
Форматные файлы
Содержат форматные записи.
Каждая запись оканчивается управляющими символами (возврат каретки, перевод строки).
Возможность "ручного" редактирования.
Скорость обработки файлов низкая.
Больший объём файлов.
Внешние и внутренние файлы.
Неформатные файлы
Содержат неформатные записи.
Отсутствует возможность "ручного" редактирования.
Скорость обработки файлов высокая.
Меньший объём файлов.
Двоичные файлы
Содержат данные в двоичном представлении.
Длина записи равна 1 байту.
Отсутствует возможность "ручного" редактирования.
Эффективны для хранения больших объёмов данных (хранение промежуточных вычислений).
Последовательный доступ
Доступ к данным по порядку
Записи переменной длины
Добавление новой записи - в конец файла
Прямой доступ
Доступ к данным произвольный
Записи одинаковой длины
Внешний файл может быть прямого и последовательного доступа
Внутренний файл только последовательного доступа
Оператор Open
Создает устройство ввода/вывода с номером u и подсоединяет к нему внешний файл name.
– dec – основание десятичной системы счисления.
Функции itoa( ), atof( ), itoa( ) содержатся в заголовочном библиотечном файле stdlib.h.
В С++ можно создавать массив из строк, то есть строковые массивы. Например, список фамилий студентов группы:
Александров.
Здесь каждая фамилия представляет собой символьный массив. Совокупность этих фамилий представляет собой массив массивов или двухмерный символьный массив.
Такие массивы очень удобны для составления различных списков, технических характеристик устройств и др. По аналогии с числовой матрицей описывается список фамилий:
char name[25][15];
Размер 25 означает число фамилий в списке, а число 15 – максимально возможное количество символов в фамилии. Каждая строка заканчивается символом null. Представив, таким образом, список студентов, можно осуществить его ввод программным путем.
for (short i = 0; i < 25; i ++)
Файл – это информация, размещенная на внешнем носителе и имеющая свое имя.
Таким образом, файл является самостоятельной информационной единицей, размещенной на каком–либо диске (магнитном, оптическом или др.). Информация, размещенная в файле, может быть разнообразной: числовой, текстовой, графической и др., в понятной для пользователя форме или в машинных кодах.
Файлы зачастую создаются для длительного хранения информации. Файлы, размещаемые на внешних носителях информации, еще называют внешними или физическими фалами.
В ряде случаев требуется устанавливать связь между внешними файлами и программой вычислений, например, для ввода исходных данных или вывода результата.
Эта связь предусматривается практически во всех алгоритмических языках, но выполняется она по–разному.
В С++ используется два вида файлов:
Текстовые файлы представляют собой совокупность строк, каждая из которых имеет в конце символ, устанавливающий признак ее окончания. На экран этот символ не выводится, но при создании файла он устанавливается. Информация в текстовых файлах представляется в удобочитаемом виде, с разделением пробелами отдельных слов, чисел. При выводе такой информации на экран ее легко прочесть.
Бинарные файлы, в отличие от текстовых, не организованы в строки и представляют собой сплошной поток информации (одну длинную строку) в двоичном коде. Прочесть пользователю бинарный файл невозможно. Однако для компьютера это весьма удобная форма представления информации, что существенно сокращает время ее обработки.
Одновременно с открытием файловой переменной fr выделяется буферная память и устанавливается связь с физическим текстовым файлом isd.txt, размещенном на диске с, в каталоге EAPU08a. Признаком того, что файл текстовый, является расширение .txt.
Операторы открытия и закрытия файла
имя файловой переменной.open (“путь и имя физич. файла.txt”, ios::доступ); |
Синтаксис оператора открытия текстового файла имеет вид:
fstream fr; // Оператор описания файловой переменной
fr.open(“c:\\EAPU08a\\isd.txt”, ios::in); //Оператор открытия файла
// isd.txt для чтения
Здесь следует обратить внимание на то, что для указания пути, имя диска и подкаталоги разделяются не одной, а двумя наклонными линиями. Часто, по привычке, эти разделения делают одной линией, что приводит к ошибке.
В компиляторах компании Microsoft при попытке открыть несуществующий файл всегда создается новый. Чтобы это исключить, следует в операторе открытия файла добавить спецификацию ios::nocreate. Это будет выглядеть как
fr.open(“c:\\EAPU\\a\\isd.txt”,ios::nocreate||ios::in);
Спецификации ios::nocreate и ios::in комбинируются с помощью логической операции || (дизъюнкция).
В компиляторах компании Borland в аналогичной ситуации новый файл не создается.После завершения работы с файлом его следует закрыть.
Синтаксис оператора закрытия файла следующий:
Имя файловой переменной.close(); |
Например, fr. close();
Внешние файлы создаются в среде языка С++. Файл исходных данных создается до создания файла, содержащего текст программы. Это объясняется тем, что при создании текста программы уже необходимо знать путь и имя внешнего файла исходных данных.
Для создания файла исходных данных необходимо выполнить следующие действия:
– раскрыть пункт меню File,
– в раскрывшемся окне выбрать пункт New и раскрыть его,
–в открывшемся окне, начиная с первой позиции набирать ряд чисел, разделяя их одним пробелом,
– после завершения этого ряда необходимо выполнить команды
File – Save as
ив раскрывшемся окне указать путь к файлу и его имя.
Примечание. При разделении каталогов в записи пути к файлу следует использовать в качестве разделителя не две наклонных линии \\ , как это делается в самой программе, а одну \ . Например: с:\EAPU\a\vec.txt
После этого в программе, в операторе открытия файла, следует использовать этот путь к файлу и его имя, но уже с разделителями в виде двух наклонных линий \\.
При создании файла, состоящей из матрицы, все элементы матрицы можно размещать в виде одного ряда чисел (строка за строкой), так же как это было описано ранее для ряда чисел.
Внешние файлы, куда выводится информация (результаты вычислений) создаются автоматически, в том месте и под таким именем, которые были указаны в операторе открытия файловой переменной для записи.
Массивы не пригодны для длительного хранения данных, по окончании работы программы данные теряются. Иногда результаты вычислений требуется сохранить для дальнейшей работы. Для этого используются файлы.
Файл это совокупность однотипных данных, имеющих имя и находящихся в памяти компьютера (внешней или в Фортране оперативной).
Файл состоит из записей. Запись – это единица обмена между программой и внешней памятью.
Количество компонент в файле заранее не оговаривается. Объём информации хранимой на внешнем носителе ограничивается ёмкостью ЗУ
указатель записи или компоненты файла конец файла
Действия с файлами состоят в чтении и записи. В любой момент времени программе доступен только один элемент файла, на который указывает УКАЗАТЕЛЬ ТЕКУЩЕЙ ПОЗИЦИИ ФАЙЛА (файловый указатель). Он определяет то место в файле, откуда (куда) производится чтение (запись) данных. Файловый указатель может находиться в начальной точке (перед первой записью), на текущей записи, в конечной точке (после последней записи – «конец файла»)
В Фортране различают два вида файлов: внешние и внутренние.
Внутренний файл - это область оперативной памяти, заданная символьной переменной. Он хранится (существует только) в оперативной памяти и открыт по умолчанию. Запись данных во внутренний файл происходит гораздо быстрее, чем во внешний файл. Внутренние файлы используются для преобразования данных из одного типа в символьный (другой). Они открыты по умолчанию. Внутренние файлы имеют только последовательный метод доступа. Устройством внутреннего файла является имя строки. Это символьная переменная (такой файл содержит одну запись, размер которой совпадает с размером переменной), элемент символьного массива или символьный массив (такой файл это последовательность элементов, каждый из которых является записью и число записей равно числу элементов массива)
Пример
Character(15) st
Write(st,*)с ! преобразование «число-строка»
Print*, st ! на экране: _____23.50000
Read(st,’(I5)’)n !преобразование строка-число
Print*,n !______________23
Внешний файл - это файл, который хранится на диске (последовательность записей на носителе) или внешние устройства (клавиатура, экран).
Чтобы работать с внешним файлом, его надо открыть (присоединить к устройству ввода/вывода). При открытии и создании файла указатель устанавливается на начало файла. Чтение и запись данных из файла автоматически вызывает перемещение указателя, т.е. указатель перемещается к началу следующей записи. При записи данных после последней компоненты ставится признак конца файла.
Для определения конца файла используется логическая функция Eof, которая возвращает значение .TRUE., если достигнут конец файла и .FALSE. в противном случае.
После окончания работы с файлом его надо закрыть.
В Фортране обращение к файлам данных происходит через канал (или устройство). Это логическое понятие, т.е. канал не устройство в обычном понимании, а воображаемый. Прежде чем выполнять ввод/вывод необходимо установить связь между физическим файлом и устройством, т.е. присоединить файл к устройству (каналу). Устройство обозначается идентификатором и это - звездочка * или целочисленное скалярное выражение. Для внешнего файла - это числовое значение от 1 до 32767 (2_147_483_640). Максимальное значение номера устройства зависит от конкретной реализации.
Каждому файлу соответствует свое логическое устройство. Одно физическое устройство может соответствовать разным логическим устройствам.
К устройствам ввода/вывода могут быть присоединены стандартные физические устройства (клавиатура и экран). Для экрана и клавиатуры в Фортране предусмотрены каналы с определенными номерами. В Фортран-программах существуют устройства с идентификаторами *, 0, 5, 6. Причем по умолчанию к устройствам *, 0, 5 присоединена клавиатура, а к устройствам *, 0, 6 – экран.
Write(n, m)
Все операторы это – вывод на экран.
Отсоединяются эти устройства автоматически после окончания работы программы. Эти устройства могут присоединяться к любому файлу.
Каждый внешний файл имеет имя. Оно должно удовлетворять правилам именования операционной системы: ‘c\users\A123\f1.txt’ – это спецификация внешнего файлаили, если это устройства - зарезервированные имена, например con, prn.
Внешний файл присоединяется к устройству ввода/вывода в результате выполнения оператора OPEN. Теперь доступ к внешнему файлу выполняется по номеру устройства, к которому он присоединен.
OPEN (unit=2, file = ‘c\users\A133\f1.txt’)
Устройство не может быть присоединено более, чем к одному файлу и наоборот.
Файл состоит из записей. Под словом «запись» понимается «логическая запись». Записью называют единицу обмена данными между программой и внешней памятью.
Запишем в файлы по два целых числа различными способами:
program main
Integer::x=25, y=10
open(1, file='numbers1.txt')
open(2, file='numbers2.txt')
End
! В файле number1.txt будет:
!в файле number2.txt будет: 25 10
Запишем в файл 5 чисел, используя различные форматы при записи:
program main
open(10, file='number1.txt')
write (10, '(I3\)') i
В файле получим: __1__2__3__4__5
program main
open(10, file='number1.txt')
write (10, '(I3)') i
В файле получим:
Все записи в файле имеют одинаковый вид.
В Фортране различают следующие виды записей (в зависимости от представления данных):
· форматные – они состоят из символов кодовой таблицы. При вводе данные преобразуются из внешнего (символьного) представления - во внутреннее представление, а при выводе – из внутреннего во внешнее;
· неформатные (бесформатные), которые содержат данные во внутреннем машинном представлении, служат в основном для запоминания результатов в промежуточных вычислениях.
Вид записи задается в операторе (теперь говорят в утверждении) open спецификаторами form=’formated’ или form=’unformated’
Запись ''конец файла” не содержит данных и ставится автоматически за последней записью файла.
Внешние файлы различают:
по способу доступа к данным;
по структуре (в зависимости от представления данных;)
По способу доступа (методу доступа) к данным:
· последовательный
· прямой
Метод доступа определяет порядок, в котором можно обрабатывать записи файла.
Последовательный метод доступа предполагает последовательное считывание данных, до нахождения искомого. В файлах последовательного доступа новые данные добавляются только в конец файла. Последовательные неформатные файлы не могут непосредственно редактироваться. Записи в последовательном файле могут иметь разную длину. Для изменения записи в последовательном файле возможен только такой путь: прочитать все записи в массив, сделать изменения и записать массив в файл или использовать для редактирования временный вспомогательный файл, сделать в нем необходимые изменения, и затем переписать содержимое временного файла в исходный. По окончании работы временный файл автоматически удаляется.
Прямой метод доступа позволяет читать записи в произвольном порядке (добраться до любой компоненты, не перебирая предыдущие). При такой организации компоненты файла (записи) имеют фиксированную длину (recl, которая указывается в операторе open)и свой уникальный номер (от 1 до n). Для доступа к данным надо указать только их номер. Их можно считывать и записывать в любом порядке.
В зависимости от представления данных внешние файлы могут быть (различаются по структуре):
Вид записи задается в операторе Open. Записи форматного файла хранятся в виде символов таблицы ASCII и представляют собой последовательность символов. Числа хранятся в символьном представлении. Каждая запись заканчивается символом возврата каретки(CR) и перевод строки(LF). Форматные файлы могут создаваться, редактироваться и просматриваться в любом текстовом редакторе (поддерживающим кодировку). Если необходим визуальный просмотр данных, то следует использовать форматный файл.
В неформатных файлах данные хранятся во внутреннем представлении. Они обрабатываются быстрее, т. к. не требуется преобразование из внутреннего представления во внешнее (форматное). Служат в основном для запоминания промежуточных результатов вычислений. Неформатные файлы могут быть созданы и просмотрены только программным путем.
Данные в бинарных файлах хранятся в двоичном представлении. Эти файлы – нетипичны для Фортрана (поддерживаются не во всех версиях), и мы их рассматривать не будем.
Таким образом, Фортран поддерживает два метода доступа и три структуры (форматные, неформатные, бинарные). Поэтому в Фортране существуют 6 разновидностей файлов. Мы будем рассматривать только типичные файлы:
· Форматные последовательные (текстовые);
Обычно в программе при организации ввода/вывода предполагается следующий порядок операторов:
Сначала оператором openфайл открывается (присоединяется к устройству, и определяются его свойства). Затем осуществляются действия по передаче данных (read, write). После окончания работы с файлом, его отсоединяют от устройства (закрывают файл - close).
При выборе типа файла надо учитывать далее перечисленные обстоятельства. Если необходим визуальный контроль данных, то следует использовать форматные файлы. Но в текстовых файлах могут возникнуть ошибки округления. Неформатные файлы имеют меньший размер, по сравнению с текстовыми файлами. В неформатных файлах передача данных осуществляется быстрее, т.к. не требуется преобразования данных.
1. Создать файл, например, с именем Dan1.pasв каком-либо текстовом редакторе и записать туда необходимую информацию.
Файл можно создавать в любом текстовом редакторе (Word, Блокнот и т.д.), но для удобства работы с этим файлом (и особенно в процессе отладки программы) внешний файл надо создать в текстовом редакторе Паскаля.
2. Создать внешний файл данных можно и программно, т.е. в программе создать этот файл и программно же записать туда нужную информацию (данные.)
Запись файла
Под записью файла понимается:
- создание нового файла;
- вывод данных в результате работы программы из оперативной памяти во внешний файл (ОП → ВФ).
Для этого необходимо выполнить следующие действия:
1. Открыть файл для записи с помощью процедурыRewrite(Fv); где Fv – файловая переменная.
При этом текущий указатель файла (ТУ) устанавливается на начало файла. Если в файле до этого была информация, то она затирается, и указатель устанавливается на начало файла.
Схематично выполнение процедуры Rewriteможно представить так:
До процедуры Rewrite После процедуры Rewrite
2. Вывод данных во внешний файл производится с помощью процедурыWrite.
Происходит запись во ВФ значений из списка вывода>,после этого выставляются маркеры концов строк (МКС) и маркер конца файла (МКФ).
3. Закрыть файл для записи с помощью процедуры
Если случайно забыть процедуру Close, то во внешнем файле сформируется «чeпyxa».
Пример 8.1. Сформировать одномерный массив квадратов чисел от 1 до 10. Записать его во внешний файл с именем Dan1.pas в текущей папке (там же, где и программа).
Program Demo-VnF;
Var A : Array[1..10] of integer;
Assign (Fout, ‘Dan1.pas’);
ReWrite (Fout);
For i:=1 to 10 do
Write (Fout, A[i] : 5);
В результатом работы программы будет создан файл Dan1.pas в текущей папке, содержащий следующий набор данных:
Символ «-» означает пробел.
Пример 8.2. Сформировать двухмерный массив случайных чисел и записать его во внешний файл с именем Dan3.pas на дискетку.
Program D_Vn_F;
Var A: Array[1..10, 1..10] of real;
Assign(Fout, 'А:\Dan3.pas');
Rewrite(Fout);
For i:=1 to 5 do
For j:=1 to 7 do
Writeln(Fout);
Результатом работы программы будет текстовый файлDan3.pas, содержащий матрицу случайных чисел из 5 строк и 7 столбцов.
Таким образом, созданы внешние файлы Dan1.pas иDan3.pas. Эти файлы можно использовать в других программах, считывая данные из этих внешних файлов, а не вводя их с пульта. Эти файлы можно скопировать, переименовать, отредактировать в каком-либо текстовом редакторе.
Чтение внешнего файла
Чтение внешнего файла – это ввод данных из внешнего файла в оперативную память компьютера (ВФ → ОП).
Выше мы договорились, что рассматриваем файлы последовательного доступа, т.е. для чтения n-го элемента этого файла необходимо прочесть все первые n-1 элементов.
Допуск к элементам файла осуществляется через текущий указатель (ТУ). При считывании данных ТУ последовательно перемещается к следующему элементу и делает его доступным для чтения.
При чтении внешнего файла, т.е. при вводе данных из внешнего файла необходимо выполнить следующие действия:
1. Открыть файл для чтения с помощью процедуры
При этом вся информация в файле сохраняется, а текущий указатель устанавливается на начало файла.
Схема выполнения процедуры ReSet:
До процедуры ReSet После процедуры ReSet
S1 | S2 | … | Sn | МКФ | S1 | S2 | … | Sn | МКФ |
2. Прочитать (ввести) данные из ВФ с помощью процедуры Read.
Форматпроцедуры: Read (Finp, x).
Значение текущего элемента из ВФ записывается в переменную х, текущий указатель перемещается к следующему элементу.
х -текущий указатель
3. Считанные данные обработать программно.
4. Закрыть файл с помощью процедуры Close (Finp);
Пример8.3.Прочитать 5 значений данных из созданного в примере 8.1 внешнего файла Dan1.pas (там их 10) и вывести их на экран.
Program D_Vn_F;
Var A: Array[1..10] of integer;
Assign(Finp, 'Dan1.pas');
For i:=1 to 5 do
В результате работы программы на экран будут выведены пять чисел: -----1-----4-----9----16----25
Функция EOF
Если заранее число элементов во внешнем файле неизвестно, то используется стандартная функция EOF (End Of File). Функция фиксирует положение текущего указателя файла на последнем элементе ВФ, т.е.
Схематично это выглядит так:
ТУ EOF=F ТУ EOF= T
S1 | S2 | ……… | Sn | МКФ |
Пример 8.4. Считать все имеющиеся данные из ВФ Dan1.pas и вывести их на экран.
Программа аналогична программе примера 8.3. Запишем только фрагмент ее.
Assign(F, 'Dan1.pas');
While not EOF(F) do
Контрольные вопросы и задания
1. В каких случаях полезно использовать внешние файлы данных. Понятие текстового файла данных.
2. Зачем используется специальная файловая переменная? Как устанавливается соответствие файловой переменной внешнему файлу?
3. Что общего у процедур Reset и Rewrite, чем они отличаются?
4. Зачем применяется процедура Close и что может произойти при ее отсутствии?
5. Сформировать массив C[N] из элементов арифметической прогрессии для a0=2, d=3 и записать его во внешний файл Dan.pas
6. Написать фрагмент программы, позволяющий считать массив А[N,M] из внешнего файла Dan.pas и найти произведение диагональных элементов.
7. Написать фрагмент программы, позволяющий считать массив C[N] , N=10 из внешнего файла Dan.pas и найти минимальный элемент.
8. Сформировать вектор В[N], используя функцию Rendom, и записать его во внешний файл Dan.pas.
Читайте также: