Pascal удалить строку из файла
Каждый программист должен знать, как работать с файлами. Файлы используются для сохранения данных, т. е. в качестве хранилища данных, таким образом, что они могут быть получены в любой момент, без их воссоздания. Файлы можно использовать для сохранения пользовательских настроек, журналов ошибок, измерение или вычисление результатов, и многое другое. В данном разделе описываются основы использования файлов.
Процедурный стиль
Это довольно старый стиль, использующейся ещё во времена, когда 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 обратно в файл:
Демо: сохранить одну строку в файл
Для того, чтобы сохранить одну строку в файл, вы можете воспользоваться процедурой, описанной ниже.
Для связи файла в коде программы и действительного файла на внешнем носителе используется процедура ASSIGN :
где myfile — имя переменной (объявленной ранее в области var ), ассоциированной с файлом
c:\text.txt — путь к реальному файлу
Первый аргумент процедуры assign в паскаль — переменная, второй – путь к файлу на диске.
Для считывания из файла достаточно связать поток ввода с файлом:
begin Assign(input,'24.txt'); var s := ReadString; . end.
begin Assign(input,'26.txt'); var N := ReadInteger; var a := ReadArrInteger(N); . end.
Текстовые файлы в паскале: процедуры работы
Текстовый файл в Паскале — это совокупность строк произвольной длины, которые разделены между собой метками конца строки, а весь файл заканчивается меткой конца файла.
Возможные расширения файлов:
*.txt, *.log,
*.htm, *.html
Метод работы с текстовым файлом в Паскале предусматривает лишь последовательный доступ к каждой строке файла. Это означает, что начинать всегда возможно только с первой строки, затем проходя по каждой строке, дойти постепенно до необходимой. Т.е. можно сказать, что чтение (или запись) из файла (в файл) ведутся байт за байтом от начала к концу.
Предусмотрены два режима работы: режим для записи в файл информации и для чтения ее из файла. Одновременная запись и чтение запрещены.
Открытие файла (классический Pascal)
Допустим, мы в программе описали переменную для работы с текстовым файлом:
Рассмотрим дальнейшую последовательность работы с ним, и рассмотрим процедуры, необходимые для работы с текстовым файлом в Паскале:
процедура открытия существующего файла для чтения при последовательном доступе:
процедура открытия создаваемого файла для записи в него информации; если файл с таким именем уже существует, то информация в нем стирается:
процедура добавления в конец:
- При открытии курсор устанавливается в начало файла.
Чтение из файла (классический Pascal)
Read (f, список переменных); ReadLn (f, список переменных);
Отличие ReadLn от Read в том, что при использовании readln после прочтения данных пропускаются все оставшиеся символы в данной строке, включая метку конца строки.
- чтение осуществляется с той позиции, где в данный момент стоит курсор;
- после чтения курсор сдвигается к первому непрочитанному символу.
close ( f ); reset ( f );
Запись в текстовый файл (классический Pascal)
Write (f, список переменных); WriteLn (f, список переменных);
где 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.
begin Assign(input, '1.txt'); var a := ReadString; var b := ReadString; var c := ReadString; print(a, 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.
begin Assign(input, '1.txt'); var n, k: integer; while not eof(input) do begin inc(n); while not eoln(input) do begin inc(k); var a := ReadChar; end; var b := ReadString; end; print($'строк , символов ') 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.
begin Assign(input, 'input.txt'); Assign(output, 'output.txt'); var p := 1; while not eof(input) do begin var x := readInteger; p := p * x; end; print($'произведение
'); end.
pascal file text1. В цикле записать в файл числа от 1 до 10 (каждое — в своей строке), а затем их считать и отобразить на экране.
Дополните код:
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)
* Из задачника М. Э. Абрамян (Text5)
* Из задачника М. Э. Абрамян (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.
begin var s := readstring('s: '); Assign(input, 'input.txt'); Assign(output, 'output.txt'); println(S); while not eof(input) do begin s := ReadString; println(s); end; close(input); // обязательно! close(output); // обязательно! Erase(input); Rename(output, 'input.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.
begin var k := readinteger('k: '); Assign(input, 'input.txt'); Assign(output, 'output.txt'); var i:=0; while not eof(input) do begin var s := ReadString; inc(i); if i<>k then println(s); end; close(input); // обязательно! close(output); // обязательно! Erase(input); Rename(output, 'input.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.
begin Assign(input, 'input.txt'); Assign(output, 'output.txt'); var s:=readString; var s1:=''; var ind := s.IndexOf('101'); while ind<>-1 do begin s1+=s[:ind+1]; s1+='000'; delete(s,1,ind+3); // удаляем всё вместе с 101 ind := s.IndexOf('101'); end; s1+=s; Println(s1); end.
Работа с данными из файла как с массивом
Пример 7: В файле input.txt записаны числа (каждое — с новой строки), их количество не превышает 100. Необходимо отсортировать их по возрастанию и записать в файл output.txt.
- для сортировки необходим массив, для того чтобы одновременно работать со всеми числами;
- неизвестно общее количество чисел.
- объявляем массив для 100 элементов;
- открываем файл на чтение, просчитываем количество чисел, заполняя массив, сохраняем количество в N;
- сортируем N элементов массива;
- записываем результат в файл.
pascal file text5. В файле input.txt записаны числа (каждое — с новой строки), их количество не превышает 100. Необходимо найти максимальное и минимальное число и записать их в файл output.txt.
* Из задачника М. Э. Абрамян (Text16)
А теперь вернемся к олимпиадному заданию по Паскалю, частично решенному на одном из предыдущих заданиях:
Пример 8: Шифр Цезаря заключается в том, что каждая буква исходной строки заменяется третьей после нее буквой в алфавите, который считается написанным по кругу (все символы текста латинские и прописные).
Решить ту же задачу, в которой сдвиг будет не на 3 позиции, а на k, причем отрицательное значение является признаком сдвига влево, положительное — вправо.
Формат входных данных (файл p.in): В первой строке записано число k, не превышающее по модулю 20. Во второй строке — текст, который необходимо зашифровать. Все символы текста латинские и прописные.
Формат выходных данных (файл p.out): Выведите зашифрованный текст.
Пример:
p.in | p.out |
---|---|
3 hello earth | khoor hduwk |
* желательно создать файлы и записать данные в исходный файл «вручную»
* программа решена для k=3, выполните программу для любых k (не превышающих 20 по модулю)
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. -->
Вечер добрый!
Хочу обратиться к вам с такой проблемой:
1)Не могу разобраться с удалением какой-либо записи из файла.
2)Сортировка записей в файле данных по определенному ключу.
Я только начинаю изучать паскаль и некоторые моменты мне пока не понятны!
Понимание, конечно,приходит,но с опозданием.А иногда эта задержка черевата последствиями(для студентов конечно. ).
Если есть возможность помогите .
P.S.:Прилагаю файл-исходник Books_of_. (.Pas фаил переименнованный в .txt для того что-бы вы могли посмотреть исходник)
и файл Книги.txt (Содержиться информация о книгах в библиотеке)созданный через эту же программу.
если по условиям задачи Ваш типизированный файл помещается в память (например, в массив записей), то задача сводится к элементарной:
считываем полностью файл в array[1..МаксимальноВозможноеКоличествоЗа писей] of TMyRecord;
сортируем этот массив.
записываем отсортированный массив в файл, либо в новый, либо в старый (в этом случае лучше исходный файл при этом переименовывать в имя.BAK)
всё.
если же файл по каким-либо причинам нельзя считывать в память - то тогда это намного сложнее. погуглите по словам "внешняя сортировка"
Чего-то я немножко недопонял из выше сказанного!!
А файл(Мною созданный)Содержит информацию о книгах и включает в себя:
1) Удк;
2)Фамилию и инициалы автора;
3)Название книги;
4)Год издания;
5)Количество экземпляров в библиотеке
Эти пять позиций для каждой книги.
и надо отсортировать их по году издания!
вот начальный текст программы,где указываються типы переменных в записи!!
просто везде пишут по разному:где-то надо метки какието ставить,гдето динамические файлы реализовывать.
за ранее благодарен.
ладно. спрошу по простому - СКОЛЬКО МАКСИМАЛЬНО КНИЖЕК МОЖЕТ БЫТЬ В ВАШЕМ ФАЙЛЕ (BookFile:file of Books; ) ??
Т.е. можно ли считать, что у Вас не может быть больше, чем, скажем 900 книг (к сожалению, для DOS TurboPascal есть ограничение на сегмент данных, и для Вашей структуры записи более 950 записей в памяти не поместятся).
Если ограничение устраивает. тогда всё просто:
Дальше сортируйте BookArr (любым способом, хоть тем же "пузырьком") - и записывайте полученный массив в файл.
Дело в том, что Файл уже создан и содержит пока 4-ре записи,но будет дополняться педагогом(Для проверки работоспособности программы);
получается надо
1) (BookArr : array[1..900] of Books ввести в описание основной программы как переменну или же обозначить ее уже в самой процедуре?
если в процедуре тогда туда-же надо вводить переменную BookCount(Это как я понимаю счетчик записей)
вообщем вот это текст программы,две последние процедуры(Если их можно так назвать) -это я пробовал чтонибудь сделать ссортировкой.
uses
crt;
type
Books=record
Udk:integer;
Fio:string[30];
Nazv:string[30];
God_Izd:word;
Kol_Ekz:word;
end;
var
BookFile:file of Books;
Work:Books;
Vid:byte;
End_Menu:boolean;
Name:string[15];
BookArr:array[1..10] of Books;//эту запись я ввел после прочтения вашего ответа,Но не уверен в правильности своего ввода!!
procedure Name_File;
begin
writeln('Введите имя файла');
readln(Name);
end;
procedure AddRec;
begin
Writeln ('Ввод записи №',FilePos(BookFile)+1);
with Work do
begin
write ('Введите Удк');
readln (Udk);
Write ('Введите Фамилию и инициалы ');
readln (Fio);
write ('Введите название ');
readln (Nazv);
write ('‚Введите год издания ');
readln (God_Izd);
write ('‚Кколичество Экз_ов');
readln (Kol_Ekz);
write (BookFile,Work);
end;
end;
procedure Create_book_Of_Lib;
var
ind,count : integer;
begin
name_file;
assign (bookfile, name);
rewrite (bookfile);
writeln ('создание файла записи ',Name);
write ('введите кол-во записей ');
readln (count);
for ind:= 1 to count do
addrec;
writeln('создание файла завершенно');
writeln('Файл содержит ',filesize(bookfile),' записей');
close(bookfile);
end;
procedure OutputRec;
begin
read(bookfile, work);
with work do
begin
writeln('Запись № :', FilePos(bookfile));
writeln('Удк :',Udk);
writeln('Фио :',Fio);
writeln('Название :',Nazv);
writeln('Год :',God_Izd);
writeln('Кол-во Экз :',Kol_Ekz);
end;
end;
procedure OutputAllrec;
begin
Name_File;
Assign(BookFile,Name);
Reset(BookFile);
if IOresult=0 then
begin
Seek(Bookfile,0);
writeln('*** Вывод данных',Name,' ***');
while (not Eof(BookFile)) do
OutputRec;
end
else
writeln('Файла с именем',Name,' не существует');
end;
Procedure UpdateRec;
var
NumRec:longint;
begin
Name_File;
Assign(BookFile,Name);
Reset(BookFile);
if IOresult=0 then
begin
Write('Введите номер изменяемой записи');
Readln (NumRec);
Seek(BookFile,NumRec-1);
writeln('--старое значение записи--');
OutputRec;
Seek(BookFile,NumRec-1);
writeln('задаем новое значение ',NumRec,' записи');
AddRec;
Close(BookFile);
end
else
writeln('Файла с именем '+Name+' не существует');
end;
procedure addrectoend;
begin
name_file;
assign(bookfile, name);
reset(bookfile);
if ioresult = 0 then
begin
seek(bookfile,filesize(bookfile));
addrec;
Writeln('Измененый файл имеет',filesize(bookfile), ' записи');
close(bookfile);
end
else
writeln('Файла с именем'+Name+' на диске нет');
end;
procedure Del_Rec;
var NumRec:integer;
begin
Assign(BookFile,'книги.txt');
reset(BookFile);
If IOresult=1 then
begin
writeln('Ошибка');
end
else
writeln('Введите номер удаляемой записи');
Read(NumRec);
begin
if NumRec>FileSize(BookFile) then
begin
writeln('Такой записи не существует');
end
else
begin
Seek(BookFile,FileSize(BookFile)-1);
read(BookFile,work);
Seek(BookFile,NumRec-1);
write(BookFile,Work);
Seek(BookFile,FileSize(BookFile)-1);
truncate(BookFile);
Writeln('Запись стерта ');
writeln('Файл данных имеет ',FileSize(BookFile),' записей');
close(BookFile);
end;
end;
begin
Name_File;
Assign(BookFile,Name);
reset(BookFile);
writeln('—вҐ*ЁҐ д ©« § ЇЁбҐ©');
while Not (Eof(BookFile)) do
begin
read(BookFile,Work);
inc(Count);
writeln('‚ д ©«Ґ ᮤҐа¦Ёвмбп ',Count,' § ЇЁбҐ©');
writeln('” ©« ¤® б®авЁа®ўЄЁ');
Seek(BookFile,0);
for i := 1 to Count do
begin
read(BookFile,Work);
writeln(Work.God_Izd);
end; >
< Procedure Sort_God; // это тоже не понятно что получилось
var
Stop:boolean;
k:integer;
begin
assign(BookFile,Name);
reset(BookFile);
while Not Eof(BookFile) do
begin
repeat
Stop := true;
for k := 1 to 3 do
if BookArr[k].God_Izd > BookArr[k+1].God_Izd then
begin
work := BookArr[k];
BookArr[k] := BookArr[k+1];
BookArr[k+1] := work;
Stop := false
end
until Stop;
Create_book_Of_Lib;
end;
end; >
begin
ClrScr;
End_Menu:=false;
repeat
writeln('*** ’Ґ«Ґд®**л© бЇа ў®з*ЁЄ ***');
writeln('1 - ᮧ¤ *ЁҐ *®ў®Ј® д ©« ');
writeln('2 - Їа®б¬®ва д ©« ');
writeln('3 - Ё§¬Ґ*ҐЁҐ ¤ **ле');
writeln('4 - ¤®Ї®«*Ґ*ЁҐ д ©« ');
writeln('5 - Ї®ЁбЄ Ї® д ¬Ё«ЁЁ');
writeln('7 - “¤ «Ґ*ЁҐ § ЇЁбЁ');
writeln('6 - ‘®авЁа®ўЄ Ї® Ј®¤г Ё§¤ *Ёп');
writeln('0 - ‡ ўҐаиҐ*ЁҐ а Ў®вл.');
writeln('‚ и ўлЎ®а');
readln(Vid);
case Vid of
1:Create_Book_Of_Lib;
2:OutputAllRec;
3:UpdateRec;
4:AddRecToEnd;
5:FindFio;
6:Sort_God;
7:Del_Rec;
0:End_Menu:=True;
end;
writeln('„«п Їа®¤®«¦Ґ*Ёп * ¦¬ЁвҐ Enter');
readln;
ClrsCR
UNTIL End_Menu;
end.
вот такой исходник!!
не могу пока въехать!)
буду конечно сейчас искать да пробовать сам,почитаю мануалы!
За Инфу спасибо. за помощь то же!
Скорее всего где-то что то не дописал ,не доглядел ну и не додумал конечно!!
В язык Паскаль выделяются данные файлового типа, которые служат для работы с информацией, расположенной на внешних устройствах. Эта информация формируется во внешней памяти компьютера, образуя некоторую область, называемую файлом. Файлы имеют имя и представляют собой совокупность однотипных элементов. Обычно они применяются, в случаях большого объема данных, долгосрочного хранения, либо необходимости предоставления доступа нескольким приложениям к одной и той же информации.
Файлы принято разделять на физические и логические. Физические файлы имеют имя, и располагаются на съемном носителе, а логические это те переменные файлового типа, которые их представляют в программе.
В Паскале различают следующие три вида файлов (в скобках описаны ключевые слова для инициализации файловой переменной):
- текстовые файлы ( text );
- типизированные ( file of );
- бестиповые ( file ).
1 Общие операции по работе с файлами
Немного позже мы разберемся с каждым из них. А сейчас рассмотрим основные операции для работы с файлами.
Создание файла
Процедура Assign связывает переменную файлового типа с физическим файлом. Например, установить соответствие между переменной Fil и текстовым файлом lot , расположенном на диске D , можно так:
Режим чтения
Процедура Reset открывает файл в режиме чтения, после чего оператором Read(, ) можно осуществить последовательное считывание элементов в программу.
Конец файла
Количество элементов в файле заранее не определяется, но часто необходимо знать о моменте достижения конца файла. Для этого в Паскале существует логическая функция EOF , которая проверяет достигнут ли конец, и если это так, то принимает значение True , иначе – False . Осуществляется проверка, как правило, в цикле, в качестве условного выражения выступает функция EOF .
Режим записи
Открыв файл в режиме записи, можно поэлементно записать в него информацию, воспользовавшись процедурой Write(, ) .
Закрытие файла
Процедура Close закрывает открытый файл, а также освобождает файловую переменную, указанную в качестве параметра.
Удаление файла
При помощи процедуры Erase , можно удалить с внешнего носителя, заранее закрытый файл.
Изменение имени файла
Rеnаmе переименовывает физический файл, который перед этим следует закрыть процедурой Close .
Смещение указателя файла
Процедура Sееk устанавливает позицию указателя в файле на необходимый элемент (нумерация элементов начинается с нуля).
Определение положения указателя
Функция FilePos принимает значение порядкового номера элемента, над которым в момент вызова находиться указатель.
Определение количества элементов
Функция FileSize определяет количество всех имеющихся в файле элементов.
2 Текстовые файлы
Текстовые файлы могут состоять из элементов символьного ( char ) и строкового ( string ) типа данных. Ключевое слово Text указывает, что файловая переменная создается для работы именно с текстовым файлом:
Структура текстового файла представляет собой последовательность строк, которые в свою очередь состоят из символов. Любая строка оканчивается признаком «конца строки», а сам файл признаком «конца файла». Для определения конца файла в Паскаль есть функция EOF , а для конца строки – EOLn :
В случае достижения конца строки она (функция EOLn ) возвращает значение True , в противном случае False .
Рассмотрим работу с текстовым файлом, на примере программы.
Место создания файла "file.txt" не было указано, поэтому он создаться в папке по умолчанию для вашей среды программирования. Для текстовых файлов в Паскале определены следующие процедуры и функции:
Процедура Append открывает существующий файл в режиме дозаписи. После чего в его конец можно добавить какую либо информацию.
Если до конца строки остались пробелы/знаки табуляции, то функция SeekEOLn возвращает значение True , иначе False .
Если до конца файла остались лишь строки с пробелами/знаками табуляции, то функция SeekEOF возвращает значение True , иначе False .
3 Типизированные файлы
Файл, определенный стандартным или пользовательским типом данных, называется типизированным. Общая форма объявления типизированных файлов имеет вид:
Здесь тип компонент может быть любым типом данных, определенных в Pascal, но только не файловым. Для работы с типизированными файлами используются уже знакомые нам процедуры и функции: Write, Read, Seek, Filesize, Filepos , а также процедура Truncate :
Она удаляет все компоненты в файле, начиная с того над которым находиться указатель.
Одной из главных особенностей типизированного файла является возможность прямого обращения к его отдельным компонентам. Это достигается за счет, того что заранее известен тип компонент файла. Рассмотрим два примера кода, в первом из которых обращение к элементам файла происходит последовательно, а во втором прямо.
Пример: вычислить среднее арифметическое элементов файла.
Пример 2: поменять строки в файле местами.
Таким образом, напрашивается вывод, что типизированные файлы несколько функциональней в обработке, чем текстовые. Далее разберем последний пункт данной статьи, а именно третий вид файлов — бестиповые файлы.
4 Бестиповые (нетипизированные) файлы
Бестиповые файлы предназначены для записи участков памяти компьютера на внешний носитель и считывания их в память. В отличие от типизированных файлов, нам не нужно знать информация какого типа хранится в них. А все потому, что данные из файлов, не имеющих типа, считываются в виде байт, после чего они «подстраиваются» под переменную, в которую происходит считывание.
Общая форма записи нетипизированных файлов
отличается от типизированных отсутствием части of . Кроме того, немного изменяется принцип действия процедур Reset и Rewrite . К ним прибавляется второй параметр типа Word:
Здесь «значение» — это новый размер буфера, который по умолчанию равен 128 байтам. В качестве минимального значения можно указать 1 байт, а максимального — 64 кбайт (число в байтах).
Также в бестиповых файлах для записи и чтения информации используются не стандартные процедуры Read и Write , а две новые: BlokRead и BlockWrite . Рассмотрим каждую из них.
Процедура BlockRead
Данная процедура считывает из файла заданное число записей, которые помещаются в память.
Общая форма записи:
x, y – обычные переменные, в первую помещается прочитанные данные, во вторую – количество считанных байт. В случае удачи y (y – необязательный параметр) будет иметь тоже значение, что и третий параметр.
Процедура BlockWrite
Для записи информации в бестиповый файл предназначена процедура BlockWrite :
Параметры процедуры BlockWrite точно такие же, как и у BlockRead . Да и принцип их одинаков, за исключением того, что первая записывает данные в файл, а вторая считывает их из него.
В следующей программе данные сначала записываются в нетипизированный файл, а затем выводятся из него посредством рассмотренных нами операций.
Возможно, что ваша среда программирования не поддерживает работу с файлами, не имеющими типа. Поэтому прежде чем начать искать ошибку в коде, стоит узнать про данную функцию.
Так уж случилось что сайт простаивает, а в свое время я занимался им активно, идея просто отличная и забросить ее не в коем случае нельзя, поэтому мной было принято решение о продаже этого сайта.
Что получает в итоге покупатель:
- Весь контент сайта(все содержимое хостинга)
- Полные права на доменное имя сайта(сделаем трансфер)
- Копирайт сайта на большом количестве сторонних ресурсов так как сайту уже более 4-х лет
- Готовый движок форума и все исходные тексты системы управления сайтом
- Все исходные тексты ПО которое опубликовано на сайте
- Все почтовые ящики доменного имени
- Все домены третьего уровня
Дополнительную информацию о статистике посещения, клиентах, вы можете узнать написав на почту koder@koder.kz
Добавил admin | Категория Pascal за 12 уроков, перевод | 06 Февраля 2014
В этом уроке мы с вами рассмотрим:
- Чтение из файла
- Создание и запись в файл
- Добавление данных в существующий файл
- Удаление файлов
- Использование директив ,
- Создание и удаление вложенных каталогов
- Описание функции FileSize()
Введение
Файл содержит данные которые в свою очередь хранятся на жестком диске подключенному к компьютеру. Операционная система предоставляет инструменты для работы с файлами(файловой системой). Текстовые файлы как правило могут содержать текст и графическую информацию, комбинированную. Для работы с текстовыми файлами используются текстовые процессоры которые имеются в операционной системе. Текстовые файлы сохраняются на жестком диске компьютера с расшитением *.TXT или *.DOC, *.DOCX. файлы с расширением *.TXT создаются с помощью стандартного текстового процессора Notepad. Но будем помнить что некоторые программы позволяют нам сохранять так сказать отформатированный текст, или текст с картинками, для таких целей NOTEPAD естественно не подходит. Для такого текста используются специальные пакеты программ, такие например как Microsoft Word, Open Office и другие. Такие программы используют несколько иной подход для создания файла нежели NOTEPAD. Таким образом файл созданный в Microsoft Word невозможно правильно открыть в NOTEPAD, а вот файл *.TXT легко открывается в текстовом редакторе Word. Программы которые могут читать файлы расширения *.Ххх называют программами просмоторщиками файлов.
Чтение из файла
Прочитать информацию из файла на языке Паскаль не составит большого труда. Обратите внимание что в Паскале нет никаких зарезервированных слов которые используются для чтения или записи информации в файл. Для этих целей используются уже знакомые нам readln() and writeln(). И так пример, как читать информацию из файла
И так что мы с вами написали. У нас появилась новая переменная типа Text. Такая переменная применяется когда вы хотите получить доступ из своей программы к определенному текстовому файлу. Переменная FileName используется для ввода пользователем имени файла(readln(FileName);). Связь переменной UserFile с файлом, путь к которому указан в переменной FileName осуществляется с помощью функции Assign полный текст будет такой Assign(UserFile, FileName + '.txt'); после этого происходит чтение из файла в цикле Repeat который завершается только после того как достигнут конец файла Eof(UserFile). Чтение из файла производиться функцией Readln(UserFile,TFile); где указывается файл из которого нужно считать строку и переменная в которую мы считаем эту строку. Процеду Writeln(TFile); выводит эту строку к нам на экран.
Создание файла, добавление данных
Давайте сразу посмотрим пример создания и добавления информации в файл.
В приведенном выше примере мы создаем файл с названием 'Textfile' на диске C:\. Создаться файл функцией Rewrite(UserFile); после чего в файл записываются строки Writeln(UserFile,'PASCAL PROGRAMMING');… Writeln(введите свою строку в ваш файл:'); тут первым параметром является файл в который записывается информация и вторым информация которую нужно добавить в файл. После чего мы считываем пользовательскую строку Readln(Txt);, добавляем пустую строку в наш файл Writeln(UserFile,'');потом говорим что сейчас будет пользовательская статья Writeln(UserFile,'The user entered this text:');, записываем пользовательскую статью Writeln(UserFile,Txt); И закрываем файл Close(UserFile);. Помните, файл всегда нужно закрывать, после окончания работы и открывать перед началом работы.
Добавление данных в существующий файл
Для того что бы добавить данные в существующий файл, его нужно открыть на чтение, добавить нужную информацию и закрыть, но не перезаписывать. Некоторые начинающие программисты на самом деле плохо понимают как не перезаписать файл с данными которые они хотели ввести, это общая проблема:
Выполните программу несколько раз, откройте файл 'C:\ADDTEXT.TXT' и посмотрите что в нем. Вы видите только одно предложение? ReWrite(UFile); функция которая открывает файл на перезапись.
Понимаете да что нам не подходит открытие файла с помощью ReWrite(UFile);, нужна какая то новая функция, и она есть это append(f) где F это переменная типа текст, ну мы с вами проходили уже это в этом же уроке. Теперь наша программа будет выглядеть так:
Выполните программу несколько раз для того что бы увидеть изменения.
Удаление файлов
В Паскале для того что бы удалить файл используется зарезервированное слово Erase(f) где F может быть путем к файлу('C:\ADDTEXT.TXT') или самим файлом, переменной типа текст. Важным замечанием будет то что файл удаляется совсем, то есть в корзине своего компьютера вы его не найдете.
В отличии от других функций для работы с файлами функция Erase(f) не открывает файл для его удаления, так что вам не нужно закрывать файл после его удаления.
Пример программы:
Если наш файл не найден функция IOResult вернет значение 0 а если файл не найдет значит функция вернет отличное от нуля значение.
ВАЖНО: если файл успешно найден, файл откроется и вы должны поработав с ним закрыть его, как показано в примерах выше. А вот если он не найден то здравый смысл подсказывает что он не может быть открыт, соответственно и закрывать и работать нам не с чем. Внимательно посмотрите пример еще раз, если у вас есть какие то вопросы, пожалуйста задавайте их в комментариях. Запустите программу несколько раз, с существующими и не существующими файлами, посмотрите на результат работы.
Директивы компилятора рекомендуется использовать со всеми функциями для открытия файлов 'rewrite()', 'append()', 'erase()', а так же 'FSearch()'. Обязательно попрактикуйте этот урок, повторюсь, в случае вопросов обязательно оставляйте их в коментариях. Создание и удаление вложенных каталогов
В языке Pascal есть функции для работы с каталогами. С помощью их можно создавать или удалять каталоги с жестких дисков компьютера. Что бы создать директорию в Паскале используется функция 'createdir(c)' где С имеет тип PChar. PChar является переменной указателем, которая содержит адрес динамической переменной заданного типа. Каталог создается следующим образом:
NewDir := FSearch('C:\Pascal Programming',GetEnv('')); if NewDir = '' then CreateDir('C:\Pascal Programming');
давайте теперь пример, сразу в примере разберем функцию FSearch:
Тип переменной, 'PathStr', является новой для вас, это переменная, определенная в "dos.tpu" библиотеки. Таким образом для того что бы наш код скомпилировался нам необходимо в Uses нашей программы добавить этот модуль. Функция FSearch() реализована в модуле WINDOS поэтому он так же включен в нашу программу. Для того что бы удалить каталог нам нужно использовать функцию remove() в конце нашей программы. Ваша операционная система будет автоматически удалять каталог если он существует. Ошибки не возникнет если вы попытаетесь удалить каталог который не существует.
Описание функции FileSize()
Последний на сегодня и самый интересный материал о файлах это размер файла в байтах или функция FileSize(). Что бы вернуть размер файла нам понадобиться переменная типа LONGINT. И так смотрим пример:
Читайте также: