Основы программирования — второй семестр 08-09; Михалкович С.С.; I часть — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Файлы)
Строка 54: Строка 54:
 
*'''копировать'''
 
*'''копировать'''
 
*'''удалять'''
 
*'''удалять'''
 +
 +
С каждым открытым файлом связан так называемый '''файловый указатель''', который указывает на текущую позицию в файле.
 +
<br />Файловый указатель создается при открытии файла, и, как правило, устанавливается на 1й элемент файла.
 +
<br />После каждой операции чтения или записи файловый указатель продвигается вперед на размер считанных элементов.
  
 
''<u>Паскаль-программа</u>''
 
''<u>Паскаль-программа</u>''
Строка 79: Строка 83:
 
   Close(f);
 
   Close(f);
 
end.</source>
 
end.</source>
 +
<xh4>2 способа открытия файла</xh4>
 +
#<tt>'''Reset'''(f)</tt> — открытие текстового файла на чтение, а двоичного — на чтение и запись; <br />файл должен существовать;  <br />файловый указатель — на начало файла;
 +
#<tt>'''Rewrite'''(f)</tt> — создание нового файла (если такого файла не существовало) или обнуление существующего; <br />файловый указатель — в начало; <br />текстовые файлы при этом открываются ''только'' на запись, а двоичные — на чтение и запись;
  
 +
Функция <tt>'''Eof(f)'''</tt> [расшифровывается как End Of File] возвращает ''true'', если файловый указатель находился за концом файла.
  
<xh4></xh4>
+
После работы с данными в файле его необходимо закрыть с помощью <tt>'''Close'''(f)</tt>.
<source lang="Pascal"></source>
+
<br />Если, ''не закрывая'', выполнить <tt>'''Reset'''(f)</tt>, то файловый указатель просто ''перейдет к началу''.
===Основные подпрограммы для работы с файлами===
+
===Буферизация в файлах===
[http://pascalabc.net/downloads/pabcnethelp/LangGuide/StandardProcFunc/stand_file.htm заголовок ссылки]
+
С каждым файлом связан некий '''буфер памяти''', в который информация из файла частично считывается, и, из которого записывается в нужную часть файла.
[http://pascalabc.net/downloads/pabcnethelp/LangGuide/StandardProcFunc/stand_system.htm заголовок ссылки]
 
[http://pascalabc.net/downloads/pabcnethelp/LangGuide/StandardProcFunc/stand_file_name.htm заголовок ссылки]
 
Assign
 
Reset
 
Rewrite
 
Close
 
Eof
 
Read
 
Write
 
Erase
 
Rename
 
  
===Дополнительные подпрограммы для работы с файлами===
+
Наличие буфера ''ускоряет'' операции чтения и записи, поскольку они выполняются преимущественно не с внешним устройством (файлом), а с участком оперативной памяти.
  
FileExists
+
Если забыть закрыть файл, открытый на запись, то можно потерять лишь данные, сохраненные в буфере.
DeleteFile
+
===Подпрограммы для работы с закрытыми файлами===
RemoveDir
+
  procedure '''Rename'''(f, name);
GetCurrentDir
+
        //переименовывает файл, связанyый с файловой переменной f, давая ему имя name
  SetCurrentDir
+
  procedure '''Erase'''(f);
CreateFir
+
        //удаляет файл, связанный с файловой переменной f
  ExtractFilePath
 
ExtractFileName
 
ExtractFileExt
 
  
 +
function '''FileExists'''(name): boolean;
 +
        //возвращает True, если файл с именем name существует
 +
 +
function '''DeleteFile'''(name): boolean;
 +
        //удаляет файл. Если файл не может быть удален, то возвращает False
 +
function '''RemoveDir'''(name): boolean;
 +
        //удаляет каталог. Возвращает True, если каталог успешно удален
 +
 +
function '''GetCurrentDir''': string;
 +
        //возвращает текущий каталог
 +
function '''SetCurrentDir'''(name): boolean;
 +
        //устанавивает текущий каталог. Возвращает True, если каталог успешно установлен
 +
function '''CreateDir'''(name): boolean;
 +
        //создает каталог. Возвращает True, если каталог успешно создан
 +
 +
function '''ExtractFileName'''(name): string;
 +
        //выделяет имя файла из полного имени файла name
 +
function '''ExtractFileExt'''(name): string;
 +
        //выделяет расширение из полного имени файла name
 +
function '''ExtractFilePath'''(name): string;
 +
        //выделяет путь из полного имени файла name
 
=== Обработка ошибок ввода-вывода для файлов ===
 
=== Обработка ошибок ввода-вывода для файлов ===
 +
<xh4></xh4>
 +
<source lang="Pascal"></source>
 
Пример. Проверка файла на существование.
 
Пример. Проверка файла на существование.
  
===Буферизация файлов===
 
 
<small>Лекция 2</small>
 
 
===Подпрограммы для работы с типизированными файлами
 
===Подпрограммы для работы с типизированными файлами
 
  Truncate
 
  Truncate

Версия 21:17, 17 февраля 2009

Лекция 1

Файлы

Введение

Файл — именованная область на диске, содержащая некоторую информацию.

Преимущества:

  1. хранят данные в промежутках между запусками программ;
  2. размер данных в файле может существенно превышать оперативную память компьютера;

Классификация файлов

Файлы обычно классифицируют по двум признакам:
1. по типу компонент:

  • текстовые
  • двоичные:
типизированные
бестиповые

2. по способу доступа:

  • последовательный
  • произвольный

<xh4>Текстовые файлы</xh4> text

Состоят из строк переменной длины, в конце каждой из которых находится символ перехода на новую строку (#13#10 в Windows, #10 в Linux).
Замечание. В PascalABC.NET это константа NewLine. <xh4>Двоичные файлы</xh4> Информация хранится в виде двоичного кода. <xh4>Типизированные файлы</xh4> file of <type>

Содержат данные одного типа. <xh4>Бестиповые файлы</xh4> file

Могут хранить данные различных типов.


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

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

Замечание.

Все файлы, содержащие элементы разного размера могут иметь только последовательный доступ к элементам. Таковыми являются:
  • текстовые
  • бестиповые файлы
Типизированные файлы имеют произвольный доступ.

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

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

Закрытый файл можно:

  • переименовывать
  • перемещать
  • копировать
  • удалять

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

Паскаль-программа

var f: file of integer;
begin
  Assign(f, 'a.dat');
    {связывает файловую переменную f с файлом на диске 'a.dat'
    (файл на диске может отсутствовать)}
  
  //файл состоит из элементов (1, 2, 3)
  Reset(f);               //файловый указатель — на элемент "1"
  
  var x: integer;
  read(f, x);             //x = 1
                          //файловый указатель — на элемент "2"
  
  write(f, x + 4, 666);   //теперь файл состоит из элементов (1, 5, 666)
                          //файловый указатель — за концом файла

  {выполнить read(f, x) НЕЛЬЗЯ, т.к. произойдет
   ошибка времени выполнения
   "чтение за концом файла"}
  write(f, 777);          //можно
  
  Close(f);
end.

<xh4>2 способа открытия файла</xh4>

  1. Reset(f) — открытие текстового файла на чтение, а двоичного — на чтение и запись;
    файл должен существовать;
    файловый указатель — на начало файла;
  2. Rewrite(f) — создание нового файла (если такого файла не существовало) или обнуление существующего;
    файловый указатель — в начало;
    текстовые файлы при этом открываются только на запись, а двоичные — на чтение и запись;

Функция Eof(f) [расшифровывается как End Of File] возвращает true, если файловый указатель находился за концом файла.

После работы с данными в файле его необходимо закрыть с помощью Close(f).
Если, не закрывая, выполнить Reset(f), то файловый указатель просто перейдет к началу.

Буферизация в файлах

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

Наличие буфера ускоряет операции чтения и записи, поскольку они выполняются преимущественно не с внешним устройством (файлом), а с участком оперативной памяти.

Если забыть закрыть файл, открытый на запись, то можно потерять лишь данные, сохраненные в буфере.

Подпрограммы для работы с закрытыми файлами

procedure Rename(f, name);
       //переименовывает файл, связанyый с файловой переменной f, давая ему имя name 
procedure Erase(f);
       //удаляет файл, связанный с файловой переменной f 
function FileExists(name): boolean;
       //возвращает True, если файл с именем name существует 

function DeleteFile(name): boolean;
       //удаляет файл. Если файл не может быть удален, то возвращает False 
function RemoveDir(name): boolean;
       //удаляет каталог. Возвращает True, если каталог успешно удален 

function GetCurrentDir: string;
       //возвращает текущий каталог 
function SetCurrentDir(name): boolean;
       //устанавивает текущий каталог. Возвращает True, если каталог успешно установлен 
function CreateDir(name): boolean;
       //создает каталог. Возвращает True, если каталог успешно создан 

function ExtractFileName(name): string;
       //выделяет имя файла из полного имени файла name 
function ExtractFileExt(name): string;
       //выделяет расширение из полного имени файла name 
function ExtractFilePath(name): string;
       //выделяет путь из полного имени файла name 

Обработка ошибок ввода-вывода для файлов

<xh4></xh4>

Пример. Проверка файла на существование.

===Подпрограммы для работы с типизированными файлами

Truncate
FileSize
FilePos
Seek

Варианты использования:

Seek(FileSize(f)) - переместить файловый указатель за конец файла (Eof(f)=True)
Seek(FilePos(f)-1) - вернуться на 1 позицию назад

Пример 1. Добавление 0 в конец файла

Пример 2. Возведение всех элементов файла в квадрат.

Пример 3. Использование в базах данных - перевод Иванова в 10 группу в виде наказания

Пример 4. Сортировка файла

for var i:=FileSize(f)-1 downto 1 do
for var j:=0 to i-1 do
begin
  Seek(f,j);
  read(f,x,y);
  if x>y then
  begin
    Seek(f,j);
    write(f,y,x);
  end;
end;