Как сохранить программу на диске в паскале
Работа с файлами применяется для хранения в них дополнительной и изменяющейся информации. В файлах размещаются данные, предназначенные для длительного хранения. Каждому файлу присваивается используемое при обращении к нему уникальное имя. Файлы широко используются при решении различных задач.
При работе с файлами на Паскале следует учитывать такую особенность: работа с файлом по его имени невозможна, а для доступа к файлу необходимо сначала связать его с некоторой файловой переменной особого типа, и в будущем использовать эту переменную вместо имени файла.
Для работы с внешними файлами в блоке описания необходимо определить файловую переменную, которая будет представлять файл внутри программы var f:text;
в качестве типа файловой переменной указывается стандартное имя text.
В данном случае файловая перемененная типа text имеет имя f.
Для работы с файлами можно использовать следующие операции:
- assign для установления связи между файловой переменной и внешним именем файла.
Например: assign (имя_файловой_переменной, имя_файла);
- erase для удаления файла с диска.
Например: erase (имя_файловой_переменной);
- reset открытие существующего файла для ввода информации.
Например: reset (имя_файловой_переменной);
- rewrite создание и открытие нового файла для записи в него информации.
Например : rewrite (имя_файловой_переменной).
- close закрытие файла по окончании работы с ним.
Например: close (имя_файловой_переменной).
Для работы с файлами используются стандартные функции:
- eof нахождение конца файла,
- eoln нахождение конца строки данных.
Считывание информации из файла и занесение информации в файл организуется стандартными операторами:
write (имя_файловой_переменной, имя_записываемой_переменной) записывает символ в файл, связанный с файловой переменной,
readln (имя_файловой_переменной, имя_читаемой_переменной) чтение из текстового файла строки.
Содержимое файла можно выводить на экран, на принтер, в файл.
Примеры программ работы с файлами:
1. Для выполнения этой задачи сначала необходимо создать
файл для последующего удаления. Это можно сделать набрав и сохранив в своей папке файл с любым текстом из Паскаль АВС. Файл должен располагаться его в том же каталоге, где и ваши программы.
Удаление с жесткого диска (винчестера) файлов с помощью программы, созданной на языке Паскаль.
write('Введите имя удаляемого файла с расширением ');
Наберите, сохраните программу в своей папке. Убедитесь, что файл действительно удален.
2. Программа создает новый текстовый файл и записывает в него информацию.
При создании файла в программе дайте ему расширение pas, тогда Вы сможете обратиться к файлу, не выходя из Паскаль АВС.
uses crt; var f:text;
write('Введите имя создаваемого файла (латинскими буквами)');
writeln('Введите текст, который нужно записать в файл: ');
writeln(' По окончании нажми Esc');
После набора и проверки программы убедитесь, что ваш файл действительно создан и информация записана.
3. Программа читает из текстового файла и выводит содержимое на экран.
write('Введите имя файла (латинскими буквами) из которого нужно прочесть данные ');
for q:=1 to length(a) do
writeln(' чтение информации завершено.');
Задачи для самостоятельного решения
1. Составить программу, чтобы она создавала файл, записывала в него любой текст, а затем считывала и выводила на экран.
2. В любую имеющуюся программу добавить блок запроса пароля и сравнивать его с хранящимся в файле, если пароль не совпадает, то программу не запускать.
3. Задачу 2 изменить так, чтобы пароль шифровался по любой схеме, а при проверке программа его самостоятельно расшифровывала.
Для связи файла в коде программы и действительного файла на внешнем носителе используется процедура ASSIGN :
Текстовые файлы в паскале: процедуры работы
Возможные расширения файлов:
*.txt, *.log,
*.htm, *.html
Метод работы с текстовым файлом в Паскале предусматривает лишь последовательный доступ к каждой строке файла. Это означает, что начинать всегда возможно только с первой строки, затем проходя по каждой строке, дойти постепенно до необходимой. Т.е. можно сказать, что чтение (или запись) из файла (в файл) ведутся байт за байтом от начала к концу.
Предусмотрены два режима работы: режим для записи в файл информации и для чтения ее из файла. Одновременная запись и чтение запрещены.
Открытие файла
Допустим, мы в программе описали переменную для работы с текстовым файлом:
Рассмотрим дальнейшую последовательность работы с ним, и рассмотрим процедуры, необходимые для работы с текстовым файлом в Паскале:
процедура открытия существующего файла для чтения при последовательном доступе:
процедура открытия создаваемого файла для записи в него информации; если файл с таким именем уже существует, то информация в нем стирается:
процедура добавления в конец:
- При открытии курсор устанавливается в начало файла.
Чтение из файла
Read (f, список переменных); ReadLn (f, список переменных);
Отличие ReadLn от Read в том, что при использовании readln после прочтения данных пропускаются все оставшиеся символы в данной строке, включая метку конца строки.
- чтение осуществляется с той позиции, где в данный момент стоит курсор;
- после чтения курсор сдвигается к первому непрочитанному символу.
close ( f ); reset ( f );
Запись в текстовый файл
Write (f, список переменных); WriteLn (f, список переменных);
Процедуры работы с файлом и закрытие файла
Нахождение конца файла:
Логическая функция, возвращающая True, если достигнут конец файла.
Нахождение конца строки:
Логическая функция, возвращающая True, если достигнут конец строки.
Удалить файл в Паскале
Переименование файла в Паскале
rename(переменная_файла,'новое имя файла');
Закрытие:
Важно: Таким образом, работа с файлом осуществляется через три основных шага:Рассмотрим пример работы с файлами в паскале:
Пример 1: В файле text.txt записаны строки. Вывести первую и третью из них на экран.(предварительно создать text.txt с тремя строками)
var filetext: text; a,b,c:string; begin assign(filetext,'c:\text.txt'); reset(filetext); readln(filetext,a); readln(filetext,b); readln(filetext,c); close(filetext); writeln(a); writeln(c); end.
Пример 2: Дан текстовый файл. Вывести количество содержащихся в нем символов и строк (маркеры концов строк EOLN и конца файла EOF при подсчете количества символов не учитывать).* Из задачника М. Э. Абрамян (Text4)
var F: Text; N,K:integer; Name:String; C:Char; begin Assign(F,'c:\text.txt'); Reset(F); N:=0; K:=0; While not eof(F) do begin inc(N); While not eoln(f) do begin inc(K); Read(F,C); end; Readln(F); end; Close(F); Writeln(N,' ',K); end.
Пример 3:Считать из файла input.txt числа (числа записаны в столбик). Затем записать их произведение в файл output.txt
var p, x: integer; f: text; begin assign(f, 'input.txt'); reset(f); p := 1; while not eof(f) do begin readln(f, x); p := p * x; end; close(f); assign(f, 'output.txt'); rewrite(f); writeln(f, 'Произведение чисел ', p); close(f); end.
var filetext: text; a:string; i:integer; begin assign(filetext,'c:\text.txt'); rewrite(filetext); for i:=1 to 10 do . reset(filetext); for i:=1 to 10 do begin . . end; close(filetext); end.
pascal file text2. Даны целые положительные числа N и K. Создать текстовый файл и записать в него N строк, каждая из которых состоит из K символов «*» (звездочка).* Из задачника М. Э. Абрамян (Text1)
pascal file text3. Дана строка S и текстовый файл. Добавить строку S в конец файла.* Из задачника М. Э. Абрамян (Text5)
Пример 4: Дана строка S и текстовый файл. Добавить строку S в начало файла.* Из задачника М. Э. Абрамян (Text7)
var F_in,F_out: Text; Name,S: String; begin Write('S: '); Readln(S); Assign(F_in,'c:\text.txt'); Reset(F_in); Assign(F_out,'c:\text1.txt'); Rewrite(F_out); Writeln(F_out,S); While not eof(F_in) do begin Readln(F_in,S); Writeln(F_out,S); end; Close(F_in); Close(F_out); Erase(F_in); Rename(F_out,'c:\text.txt'); end.
pascal file text4. Дано целое число K и текстовый файл. В данном файле вставить пустую строку перед строкой с номером K . Если строки с таким номером нет, то оставить файл без изменений.Для решения задачи можно использовать дополнительный временный файл.
* Из задачника М. Э. Абрамян (Text9)
Пример 5: Дано целое число K и текстовый файл. Удалить из файла строку с номером K . Если строки с таким номером нет, то оставить файл без изменений.* Из задачника М. Э. Абрамян (Text15)
var F_in,F_out: Text; Name,line: string; K,i:integer; begin Write('K: '); Readln(K); Assign(F_in,'c:\text.txt'); Assign(F_out,'c:\text1.txt'); Reset(F_in); Rewrite(F_out); i:=0; While not eof(F_in) do begin Readln(F_in,line); inc(i); if i<>K then Writeln(F_out,line); end; Close(F_in); Close(F_out); Erase(F_in); Rename(F_out,'c:\text.txt'); end.
Пример 6: Дан текстовый файл F1 с набором нулей и единиц. Необходимо заменить все вхождения сочетаний 101 на 000 . Скорректированные записи поместить в файл F2 .var f1,f2: text; pole:string; pz:integer; begin assign(f1,'1.txt'); assign(f2,'2.txt'); reset(f1); rewrite(f2); while not eof(f1) do begin readln(f1, pole); while pos('101',pole)<>0 do begin pz:=pos('101',pole); delete(pole,pz,3); insert('000',pole,pz); end; writeln(f2,pole) end; close(f1); close(f2); end.
Работа с данными из файла как с массивом
- для сортировки необходим массив, для того чтобы одновременно работать со всеми числами;
- неизвестно общее количество чисел.
- объявляем массив для 100 элементов;
- открываем файл на чтение, просчитываем количество чисел, заполняя массив, сохраняем количество в N;
- сортируем N элементов массива;
- записываем результат в файл.
* Из задачника М. Э. Абрамян (Text16)
А теперь вернемся к олимпиадному заданию по Паскалю, частично решенному на одном из предыдущих заданиях:
p.in | p.out |
---|---|
3 hello earth | khoor hduwk |
var a:char; i,n,k:byte; s,s1:string; f_in,f_out:text; begin Assign(F_in,'z:\p.in'); Assign(F_out,'z:\p.out'); Reset(F_in); Rewrite(F_out); s1:=''; readln(f_in,k); readln(f_in,s); for i:=1 to length(s) do begin n:=ord(s[i]); if n<>32 then n:=n+3; if . then . ; if . then . ; if . then . ; a:=chr(. ); s1:=. ; end; writeln(s1); writeln(f_out,s1); close(f_in); close(f_out) end.
var a:char; i,n,k:byte; s,s1:string; f_in,f_out:text; begin Assign(F_in,'z:\p.in'); Assign(F_out,'z:\p.out'); Reset(F_in); Rewrite(F_out); s1:=''; readln(f_in,k); readln(f_in,s); for i:=1 to length(s) do begin n:=ord(. ); if n<>32 then n:=n+3; if n=123 then n:=97; if n=124 then n:=98; if n=125 then n:=99; a:=chr(n); s1:=s1+a; end; writeln(s1); writeln(f_out,s1); close(f_in); close(f_out) end.
полное решение var s, s1: string; i, j, a, n, k, b: integer; begin n := 97; s1 := ''; readln(s); readln(k); for i := 1 to length(s) do begin if s[i] <> ' ' then begin a := ord(s[i]); if a > 122 - k then for j :=123 - k to 122 do begin b:=122-j; if a = j then begin a := n+k-b-1; inc(n); end; end else a := a + k; s1 := s1 + chr(a) end else s1 := s1 + ' ' end; writeln(s1)end. --> pascal file text7. Пять делителей.Имя входного файла: z3.in
Имя выходного файла: z3.out
Все, что необходимо начинающему и опытному программисту
Файлы: сохраняем результаты работы до следующего раза
Как вам должно быть известно из общего курса информатики, память, с которой работает Паскаль и в которой он хранит все свои данные (как и любая другая программа), называется оперативной. Она обладает одним неприятным свойством: ее содержимое стирается при выключении питания компьютера. Чтобы информация сохранялась при выключенном питании (принято говорить «для долговременного хранения информации»), используется внешняя память. Это разного рода диски, дискеты и другие виды носителей. Работе с внешней памятью из программы на Паскале и посвящен наш текущий разговор.
Как работать с текстовым файлом
Файлом называется порция данных, хранящаяся на диске и имеющая имя. Другими словами, все, что вы пытаетесь сохранить на диске, должно быть записано в виде файла. Для того чтобы работать с файлом в Программе, необходимо ввести специальную переменную, которая называется файловой. Через нее мы будем записывать и читать информацию из файла.
Основным элементом текстового файла является символьная строка (ASCII). Можно работать как со строкой целиком, так и с каждым символом в отдельности. Обращение к символам, хранящимся в файле, происходит последовательно.
Открытие файла для чтения
Начиная работать с файлом, его открывают. При этом в памяти создается особая структура данных, частью которой является файловый указатель. Это как бы «курсор», который указывает на позицию файла, с которой будет происходить следующая операция чтения (или записи). После чтения символа (или строки) из файла файловый указатель передвигается на следующий символ (строку). При записи в файл эта позиция всегда указывает на конец файла.
Мы начнем с самого простого — попытаемся открыть текстовый файл для чтения и выведем его содержимое на экран. Для того чтобы программе было что открывать, создайте в Блокноте или прямо в среде Turbo Pascal текстовый файл и назовите его work.txt. Этот файл должен быть сохранен в той же папке, что и рабочие (.pas) файлы с программой на Паскале. Содержимое файла нам не важно. Мы рекомендуем набрать несколько строчек текста, желательно латинскими символами.
Пример 12.1.
Вывод на экран содержимого текстового файла work.txt
Открытие файла для записи
Из предыдущего примера вы, вероятно, поняли, что открытие файла для чтения происходит в результате процедуры reset. При этом файловый указатель устанавливается в начало файла, и процедурами чтения из файла readln и read можно построчно или посимвольно прочитать содержимое всего файла. Если же мы хотим не читать уже имеющийся файл, а записывать в файл свою информацию, мы должны открыть файл для записи. Это делает процедура rewrite.
Если в текущей папке нет файла с именем, указанным в процедуре assign, то создается новый пустой файл. Если файл с таким именем есть, его содержимое очищается. Так или иначе, файловый указатель устанавливается в начало пустого файла, после чего в файл можно записывать информацию построчно (writein) или посимвольно (write).
В следующем примере программа создает новый текстовый файл work.txt и копирует его содержимое в файл user.txt.
Пример 12.2.
Создание и копирование файла
После работы программы откройте оба файла (это можно сделать в режиме Open в среде Turbo Pascal или в Блокноте) и убедитесь, что все получилось верно.
Если вы вводили эти три строки по-русски, то в Блокноте вы, скорее всего, увидите странную путаницу из русских букв. Это от того, что Turbo Pascal — программа для MS-DOS, и символы, которые вы вводили, тоже были записаны в кодировке MS-DOS. Чтобы их нормально прочитать, нужно или открывать эти файлы из программы для MS-DOS (например, Norton Commander), или иснользовать преобразование формата (это умеет делать, например, MS Word).
Задание 12.1.
Напишите программу, которая:
а) создает текстовый файл из четырех строк строчных латинских букв;
б) читает строки из созданного файла и преобразовывает их в строки заглавных латинских букв;
в) после преобразования каждую строку записывает в другой созданный текстовый файл.
Проверьте результаты работы путем чтения обоих файлов!
Каждый программист должен знать, как работать с файлами. Файлы используются для сохранения данных, т. е. в качестве хранилища данных, таким образом, что они могут быть получены в любой момент, без их воссоздания. Файлы можно использовать для сохранения пользовательских настроек, журналов ошибок, измерение или вычисление результатов, и многое другое. В данном разделе описываются основы использования файлов.
Процедурный стиль
Это довольно старый стиль, использующейся ещё во времена, когда Pascal не был объектно-ориентированным языком. Суть его в том, что задается тип файла, определяющий, какие будут храниться в нем данные. Для этого, используется конструкция вида: file of <тип данных>, где <тип данных> - название типа, который хранит в себе файл. Помимо стандартных типов (integer, extended, char и т.д.), существует особый тип - TextFile. Он определят, что каждая строка заканчивается специальным(ми) символом(ами) конца строки (См. LineEnding). Эти файлы могут быть открыты и отредактированы внутри среды Lazarus или в любом другом текстовом редакторе.
Ниже представлены примеры создания собственных типов файлов:
Обработка ошибок ввода/вывода
Параметр компилятора обработки ошибок ввода/вывода указывает, как должна вести себя программа при возникновении ошибки в процессе работы с файлами: вызвать исключение или хранить результат операции ввода/вывода в специальной переменной IOResult.
Это задаётся с помощью специальной директивы компилятора:
В случаи подавления ошибок ввода-вывода () результат операции с файлом будет храниться в переменной IOResult типа cardinal (числовой тип). Каждое число, хранимое в IOResult определяет тип возникшей ошибки(подробнее: [1]).
Процедуры работы с файлами
Эти процедуры и функции находятся в модуле system. Для более подробной информации смотрите документацию FPC:
- AssignFile (не допускайте использование процедуры Assign) - Связывает переменную с файлом
- Append - Открывает существующий файл для записи данных в конец и их редактирования
- BlockRead - Чтение данных из не типизированного файла в память
- BlockWrite - Запись данных из памяти в не типизированный файл
- CloseFile (не допускайте использование процедуры Close) - Закрыть открытый файл
- EOF - Проверка наличия конца файла
- Erase - Стереть файл с диска
- FilePos - Получить позицию в файле
- FileSize - Получить размер файла
- Flush - Записать файловый буфер на диск
- IOResult - Возвращает результат последней операции ввода\вывода
- Read - Считать из текстового файла
- ReadLn - Считать из текстового файла и перейти к следующей строке
- Reset - Открыть файл для чтения
- Rewrite - Создать и открыть файл для записи
- Seek - Изменить позицию в файле
- SeekEOF - Переместить позицию в файле в его конец
- SeekEOLn - Переместить позицию в файле в конец строки
- Truncate - Удалить все данные, после текущей позиции
- Write - Записать переменную в файл
- WriteLn - Записать переменную в текстовый файл и перейти к новой строке
Пример
Пример работы с текстовым файлом (тип TextFile):
Теперь откройте файл в любом текстовом редакторе и вы увидите, что пример текста, записан в нем! Вы можете проверить работу обработки ошибок, установив атрибут файла "только для чтения" и снова запустив программу.
Обратите внимание, что в примере используется блок try/except. Данный способ позволяет выполнять несколько операций с файлами и использовать обработку исключений. Вы также можете использовать режим , но тогда вам придется проверять переменную IOResult после каждой операции с файлами для контроля ошибок.
Ниже приведен пример записи текста в конец файла:
Чтение текстового файла:
Объектный стиль
В дополнение к старому методу обработки файлов, упомянутому выше процедурному стилю, существует новая система, которая использует концепции потоков (данных) на более высоком уровне абстракции. Это означает, что данные могут считываться или записываться в любом месте (диск, память, аппаратные порты и т. д.) через один универсальный интерфейс.
Кроме того, большинство классов обработки строк, могут иметь возможность загружать/сохранять содержимое из/в файл. Эти методы обычно называются SaveToFile и LoadFromFile.
Двоичные файлы
Для прямого доступа к файлам, так же удобно использовать класс TFileStream. Этот класс представляет собой инкапсуляцию системных процедур FileOpen, FileCreate, FileRead, FileWrite, FileSeek и FileClose, расположенных в модуле SysUtils.
В приведенном ниже примере обратите внимание, что обработка действий с файлом, расположена внутри блока try..except. Поэтому обработка ошибок происходит так же, как в случаи использования процедур работы с файлами в классическом Pascal.
Вы так же можете загрузить весь файл в память, если его размер существенно меньше, чем имеющийся системной памяти. Если файл превышает размер системной памяти, то ваша операционная система начнет использовать файл подкачки, снижая скорость работы с файлом.
Для работы с файлами большого объёма, рекомендуется использовать буфер, например в 4096 байт.
Копирование файла
Теперь,зная методы работы с файлами, мы можем реализовать простую функцию копирования файла, скажем FileCopy.(такой функции нет в FreePascal, хотя Lazarus её имеет copyfile):
Обработка текстовых файлов (TStringList)
Для текстовых файлов можно использовать класс TStringList, чтобы загрузить весь файл в память и иметь легкий доступ к его строкам. Вы также можете записать StringList обратно в файл:
Демо: сохранить одну строку в файл
Для того, чтобы сохранить одну строку в файл, вы можете воспользоваться процедурой, описанной ниже.
Читайте также: