Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Занятие 4. Использование текстовых файлов в качестве нетипизированных.

Поиск

Рассмотрите пример.

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

Program Kodirovka;

Const

NofCod = 20; {Размер таблицы смещений кодов}

Var

FirstFile: text; {Исходный файл}

SecondFile: file; {Результирующий файл}

FirstName, SecondName: string;

IOres: byte; {Код результата работы с файлом}

NofSymb: LongInt; {Число символов в файле}

Codes: Array[1..NofCod] of byte; {Таблица смещений кодов символов}

Buffer: Array [1..NofCod] of char; {Буфер для символов}

i: word;

{Процедура записи в файл с проверкой}

Procedure WriteAndControl (Var Buf, Amount: word);

Var

result: word; {Число переданных символов}

Begin

blockwrite (SecondFile, Buf, Amount, result);

if result <> Amount

then

begin

writeln('Нет места на диске ');

Halt;

end;

End;

Begin

{Связь с исходным текстовым файлом для чтения}

repeat

{$I-}

write('Имя исходного файла: ');

readln(FirstName);

assign(FirstFile, FirstName);

reset(FirstFile);

{$I+}

IOres:= IOresult;

if IOres <> 0

then

writeln('Такого файла нет ');

until IOres =0;

{Связь с результирующим файлом без типа для записи}

repeat

{$I-}

write('Имя результирующего файла: ');

readln(SecondName);

assign(SecondFile, FirstName);

rewrite(SecondFile, 1); {Размер блока в один байт}

{$I+}

IOres:= IOresult;

if IOres <> 0

then

writeln('Неправильное имя файла ');

until IOres =0;

{Установка счетчика символов и запись его в файл}

NofSymb:= 0;

WriteAndControl(NofSymb, 4);

{Задание таблицы смещений кодов символов, запись ее в файл}

Randomize;

for i:= 1 to NofCod do

Codes[i]:= Random(256);

{Перекодировка символов и запись содержимого полных буферов в файл}

i:= 0;

while not Eof(FirstFile) do

begin

Inc(NofSymb);

Inc(i);

if Eoln(FirstFile)

then

begin

Buffer[i]:= Chr((13+Codes[i]) mod 256);

if i=NofCod

then

begin

writeAndControl(Buffer, NofCod);

i:= 0;

end;

Inc(i);

Buffer[i]:= Chr((10+Codes[i]) mod 256);

readln(FirstFile);

end;

else

begin

read(FirstFile, Symbol);

Buffer[i]:= Chr((Ord(Symbol)+Codes[i]) mod 256);

end;

if i = NofCod

then

begin

writeAndControl(Buffer, NofCod);

i:= 0;

end;

{Запись в файл завершающей части символов}

if i <> 0

then

begin

writeAndControl(Buffer, i);

{Запись числа символов}

NofSymb:= FileSize(SecondFile)-NofCod-4;

Seek(SecondFile, 0);

writeAndControl(NofSymb, 4);

{Завершение программы}

close(SecondFile);

writeln('Конец работы программы ');

readln;

End.

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

Задачи для самостоятельного решения

1. Текстовый файл преобразовать в файл целого типа следующим образом: гласные буквы заменить на число 0, согласные буквы на число 1, а все остальные символы – на число 2. Подсчитать количество согласных букв. Если в текстовом файле согласных не обнаружено, выдайте на экран соответствующее сообщение. В программе используйте способы обработки нетипизированного файла и подпрограммы.

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

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

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

5. Текстовый файл, содержащий числовую и текстовую информацию преобразовать в файл целого и символьного типа. Каждый элемент типизированного файла должен содержать цифру или символ. Если в текстовом файле числовой или текстовой информации не обнаружено, выдайте на экран соответствующее сообщение. В программе используйте способы обработки нетипизированного файла и подпрограммы.

6. Из текстового файла выделить числовую информацию и поместить ее в файл целого типа. Каждый элемент типизированного файла должен содержать цифру. Если в текстовом файле числовой информации не обнаружено, выдайте на экран соответствующее сообщение. В программе используйте способы обработки нетипизированного файла и подпрограммы.

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

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

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

10. Познакомившись с содержанием предыдущих задач придумайте свою интересную задачу и решите ее.

Занятие 5. Примеры решения творческих задач

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

Задача № 1. С помощью нетипизированного файла проанализировать файлы с расширением.mp3 в заданном пользователем каталоге и создать текстовый файл, содержащий следующую информацию: название песни, исполнитель, имя файла.

Program SedihGetTag;

{$I-}

Uses

Crt;

Var

f: file;

c: char;

S: string;

i: LongInt;

DirInfo: seachrec;

Txt: text;

Procedure Extract;

Begin

assign(f, DirInfo.name);

reset(f, 1); {размер буфера записи равен 1 байту}

l:= FileSize(f); {переменной l присваиваем размер файла в байтах}

Seek(f, l-125); {ставим указатель, на 125 символов отступив от конца файла}

{вычислил сам, проанализировав файл данного типа}

while not Eof(f) do

Begin

blockread(f, c, 1); {читаем посимвольно}

S:= S + c; {формируем строковую переменную, содержащую нужный тэг}

end;

close(f);

writeln(Txt, copy(S, 1, 30)+'-'+copy(S, 31, 30)+'-'+DirInfo.Name);

{записываем выделенную информацию в файл)}

End;

Begin

ClrScr;

assing(txt,'list.txt');

rewrite(txt);

FindFirst('*.mp3', Arhive, DirInfo);

while DosError=0 do

begin

S:= '';

Extract;

FindNext(DirInfo);

end;

close(Txt);

End.

Задача № 2. С помощью нетипизированного файла проанализировать файлы-архивы (архиватор WinRar) и вывести на экран имена заархивированных файлов.

Program LipovcevMaksim;

Uses

Crt;

Var

i, pos: integer;

f: file;

FileName, Ima: string;

s: char;

Procedure Name(Var s: char); Forward;

Procedure Poisk(Var s: char);

Begin

case Ord(s) of

20: begin

blockread(f, s, 1);

case Ord(s) of

20: Poisk(s);

48..57: begin

blockread(f, f, S, 1);

case Ord(S) of

20: Poisk(S);

1..19: Name(S);

21..32: Name(S);

end;

end;

end;

end;

end;

End;

Procedure (Name(Var S: char);

Var

k: integer;

Begin

k:=0;

for i:= 1 to 5 do

blockread(f, S, 1);

while (S<>'.') and (k<9) do

begin

blockread(f, S, 1);

k:= k+1;

ima:= Ima+S;

if S='\'

then

k:= 0;

end;

if Pos('.', Ima)<>0

then

begin

for i:= 1 to 3 do

begin

blockread(f, S, 1);

Ima:= Ima+S;

end;

writeln(Ima);

end;

Ima:= '';

End;

Begin

ClrScr;

writeln('Введите полное имя архивного файла RAR');

write('->');

readln(FileName);

reset(f, 1);

writeln('Имена заархивированных файлов:');

while not EOF(f) do

begin

blockread(f, S, 1);

Poisk(S);

end;

close(f);

readKey;

End.

Задача № 3. С помощью нетипизированного файла преобразовать файл c расширением.BMP следующим образом:

разделить рисунок на две части по горизонтали, верхнюю часть поместить на место нижней, разделить её на две части по вертикали и поменять их местами.

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

16 цветов - 118 байт, 256 цветов - 1086 байт, 24 бита - 55 байт. Это колисемтво байт влияет на значение переменное Кol в программе.

Program BaranovA;

Uses

Crt;

Const

n=1234; {установка размера буфера}

Kol=118;

Var

F1, F2: file;

Name1, Name2: string;

Buf: Array [1..n] of byte;

AllSize, PicSize, HalfSize: LongInt;

i: integer;

Begin

write('Имя файла >');

readln(Name1);

Name2:= Name1;

if Pos('.', Name2) <> 0

then

begin

Delete(Name2, Pos('.', Name2), Lenth(Name2)-Pos('.', Name2)+1);

Name2:= Name2+'.tmp';

assign(F1, Name1);

reset(F1, 1);

assign(F2, Name2);

rewrite(F2, 1);

AllSize:= FileSize(F1); {размер всего файла}

PicSize:= AllSize-Kol; {размер всего файла без описания}

HalfSize:= PicSize div 2; {половина файла}

blockread(F1, Buf, Kol);

blockwrite(F2, Buf, Kol);

seek(F1, Kol+HalfSize-1);

for i:= 1 to HalfSize div n do

begin

blockread(F1, Buf, n); {считываем и записываем из середины файла}

blockwrite(F2, Buf, n);

End;

blockread(F1, Buf, HalfSize mod n); {переписываем оставшиеся байты из не полностью заполненного буфера}

blockwrite(F2, Buf, HalfSize mod n);

Seek(F1, Kol-1);

blockread(F1, Buf, HalfSize mod n);

blockwrite(F2, Buf, HalfSize mod n);

close(F1);

close(F2);

end;

End.

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

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

Проверьте свои знания по теме, ответив на следующие вопросы:

1. Дайте определение нетипизированному файлу.

2. В чем Вы видите преимущества и недостатки работы с нетипизированными файлами по сравнению с типизированными и текстовыви файлами?

3. Объясните назначение параметров специфических для нетипизированных файлов процедур чтения и записи.

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

5. Объясните назначение процедур Аssign, Сlosе, Eof и их параметров.

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

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

8. Объясните назначение процедур Seek, FileSize, FilePos и их параметров.

9. Объясните назначение процедур rename, Truncate, Еrase и их параметров.

10. Расскажите как Вы работали над творческим заданием.



Поделиться:


Последнее изменение этой страницы: 2016-08-12; просмотров: 186; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.16.51.237 (0.01 с.)