Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Занятие 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. Расскажите как Вы работали над творческим заданием. |
Последнее изменение этой страницы: 2017-03-17; Просмотров: 308; Нарушение авторского права страницы