Текстовые файлы
Текстовые файлы связываются с файловыми переменными, принадлежащими стандартному типу TEXT. Текстовые файлы предназначены для хранения текстовой информации. Именно в такого типа файлах хранятся, например, исходные тексты программ. Компоненты (записи) текстового файла могут иметь переменную длину, что существенно влияет на характер работы с ними.
Текстовый файл трактуется в Турбо Паскале как совокупность строк переменной длины. Доступ к каждой строке возможен лишь последовательно, начиная с первой. При создании текстового файла в конце каждой записи (строки) ставится специальный признак EOLN (End OfLiNe - конец строки), а в конце всего файла - признак EOF (End Of File - конец файла). Эти признаки можно протестировать одноименными логическими функциями (см. ниже). При формировании текстовых файлов используются следующие системные соглашения:
EOLN- последовательность кодов ASCII #13 (CR) и #10 (LF);
EOF - код #26 стандарта ASCII.
Для доступа к записям применяются процедуры READ, READLN, WRITE, WRITELN. Они отличаются возможностью обращения к ним с переменным числом фактических параметров, в качестве которых могут использоваться символы, строки и числа. Первым параметром в любой из перечисленных процедур может стоять файловая переменная. В этом случае осуществляется обращение к дисковому файлу или логическому устройству, связанному с переменной процедурой ASSIGN. Если файловая переменная не указана, происходит обращение к стандартным файлам INPUT к OUTPUT.
Процедура READ.
Обеспечивает ввод символов, строк и чисел. Формат обращения:
READ (<ф.п.>,<сп.ввода>) или READ (<сп.ввода>)
Здесь <сп.ввода> - список ввода: последовательность из одной или более переменных типа CHAR, STRING, а также любого целого или вещественного типа.
При вводе переменных типа CHAR выполняется чтение одного символа из файла и присваивание считанного значения переменной. Если перед выполнением чтения указатель файла достиг конца очередной строки, то результатом чтения будет символ CR (ASCII код #13), а если достигнут конец файла, то - символ EOF (код #26). При вводе с клавиатуры символ CR вводится при нажатии на клавишу Enter, а символ EOF - при одновременном нажатии клавиш CTRL и Z.
При вводе переменных типа STRING количество считанных процедурой и помещенных в строку символов равно максимальной длине строки, если только раньше не встретились символы CR или EOF. В этом случае сами символы CR и EOF в строку не помещаются. Если количество символов во входном потоке данных больше максимальной длины строки, «лишние» символы до конца строки отбрасываются,а новое обращение к READ возвращает пустую строку. Таким образом, процедура READ не в состоянии прочесть последовательность строк: первая строка будет прочитана нормально, а все последующие окажутся пустыми. Для ввода последовательности строк нужно использовать процедуру READLN (см. ниже).
При вводе числовых переменных процедура READ вначале выделяет подстроку во входном потоке по следующему правилу: все ведущие пробелы, символы табуляции и маркеры конца строк EOLN пропускаются; после выделения первого значащего символа, наоборот, любой из перечисленных символов или символ EOF служат признаком конца подстроки. Выделенная таким образом подстрока затем рассматривается как символьное представление числовой константы соответствующего типа и преобразуется во внутреннее представление, а полученное значение присваивается переменной. Если в подстроке был нарушен требуемый формат представления численной константы, возникает ошибка ввода-вывода. Если при пропуске ведущих пробелов встретился символ EOF, переменная получает значение 0. Отметим, что в Турбо Паскале не предусмотрен ввод шестнадцатеричных констант.
При использовании процедуры READ применительно к стандартному файлу INPUT, т.е. при вводе с клавиатуры, символьные строки запоминаются в буфере, который передается процедуре только после нажатия на клавишу Enter. Это позволяет редактировать данные при их вводе. Для редактирования используются следующие клавиши:
- Backspace, Ctrl-H, перевод курсора влево - стирают символ слева от курсора;
- перевод курсора вправо - восстанавливает символ за символом предыдущую строку ввода;
- Ctrl-Z Enter - завершает ввод по процедуре READ; оставшиеся «лишние» символьные параметры принимают значение CHR(26), строки возвращаются пустыми, а численные переменные остаются без изменения.
Максимальная длина буфера ввода при работе с клавиатурой составляет 127 символов. Ввод с клавиатуры по процедуре READ сопровождается эхо-повтором вводимых символов на экране ПК.
Процедура READ прекрасно приспособлена к вводу чисел. При обращении к ней за вводом очередного целого или вещественного числа процедура «перескакивает» маркеры конца строк, т.е. фактически весь файл рассматривается ею как одна длинная строка, содержащая текстовое представление чисел. В сочетании с проверкой конца файла функцией EOF процедура READ позволяет организовать простой ввбд массивов данных, например, так:
const
N = 1000; {Максимальная длина ввода}
f: text;
m: array of real;
I: Integer;
Begin
assign(f, "prog.dat") ;
reset(£); i:= 1;
while not EOF(f) and (i <= N) do
Begin
read(f ,m[i]) ;
inc(i)
end;
close(f);
.......
end.
Процедура READLN.
Обеспечивает ввод символов, строк и чисел. Эта процедура
идентична процедуре READ за исключением того, что после считывания последней
переменной оставшаяся часть строки до маркера EOLN пропускается, поэтому
следующее обращение к READLN или READ начинается с первого символа новой строки.
Кроме того, эту процедуру можно вызвать без параметра
Если процедура используется для чтения с клавиатуры, нажатие на клавишу Enter отобразится на экране как последовательность CR + LF и курсор будет помещен в начало следующей строки, в то время как в процедуре READ эхо-повтором клавиши Enter является символ CR и курсор помещается в начало текущей строки.
Процедура WRITE.
Обеспечивает вывод информации в текстовый файл или передачу ее на логическое устройство. Формат обращения:
WRITE (<ф.п.>, <сп.вывода>) или WRITE (<сп.вывода>)
Здесь <сп.вывода> - список вывода: последовательность из одного или более выражений типа CHAR, STRING, BOOLEAN, a также любого целого или вещественного типа.
Файловая переменная <ф.п.>, если она указана, должна быть предварительно описана как переменная типа TEXT и связана с именем файла или логическим устройством процедурой ASSIGN. Если файловая переменная отсутствует, подразумевается вывод в стандартный файл OUTPUT, который обычно связан с экраном ПК.
Любой элемент списка вывода может иметь форму
OutExpr [ : MinWidth [ : DecPlaces ] ]
Здесь OUTEXPR - выводимое выражение;
MINWIDTH, DECPLACES - выражения типа WORD (квадратные скобки означают возможность отсутствия заключенных в них параметров).
Подпараметр MINWIDTH, если он присутствует, указывает минимальную ширину поля, в которое будет записываться символьное представление значения OUTEXPR. Если символьное представление имеет меньшую длину, чем MINWIDTH, оно будет дополнено слева пробелами, если - большую длину, то подпараметр MINWIDTH игнорируется и выводится необходимое число символов.
Подпараметр DECPLACES задает количество десятичных знаков в дробной части вещественного числа. Он может использоваться только совместно с MINWIDTH и только по отношению к выводимому выражению одного из вещественных типов.
Если ширина поля вывода не указана, соответствующий параметр выводится вслед за предыдущим без какого-либо их разделения.
Символы и строки передаются выводному файлу без изменений, но снабжаются ведущими пробелами, если задана ширина поля вывода и эта ширина больше требуемой для вывода.
При выводе логических выражений в зависимости от их значения выводятся строки TRUE или FALSE. (Ввод логических констант процедурами READ или READLN не предусмотрен).
Вещественные числа выводятся в экспоненциальном формате, если не указан подпараметр DECPLACES, в противном случае выбирается формат представления числа с фиксированной точкой. Экспоненциальный формат представляет вещественное число в виде
S#.##############E*####,
где:
Пробел;
s пробел для положительного и знак «-» для отрицательного чисел;
# десятичная цифра;
Е символ десятичного основания;
* знак «+» или «-» в зависимости от знака десятичного порядка числа.
Если подпараметр MINWIDTH опущен, принимается его значение по умолчанию (23). Если MINWIDTH меньше 10, считается, что он равен 10.
Если подпараметр DECPLACES равен нулю, ни дробная часть числа, ни десятичная точка не выводятся. При отрицательном значении DECPLACES этот параметр игнорируется и число выводится в экспоненциальном формате с учетом MINWIDTH. Если значение DECPLACES больше 18, принимается значение 18. Следует учесть, что при указании подпараметра DECPLACES вещественное число всегда будет выводиться в формате с фиксированной точкой и требуемым количеством знаков в дробной части, даже если значение подпараметра MINWIDTH окажется недостаточным для размещения целой части: в этом случае значение MINWIDTH автоматически увеличивается.
При выводе на экран в случае, когда длина выводимой последовательности символов превышает ширину экрана или созданного на нем окна, «лишние» символы переносятся на следующую экранную строку. При заполнении экрана или окна его содержимое сдвигается вверх на одну строку.
Процедура WRITELN. Эта процедура полностью идентична процедуре WRITE за исключением того, что выводимая строка символов завершается кодами CR и LF. При вызове WRITELN можно опускать параметр <сп.вывода>: в этом случае в файл передается маркер EOLN, что при выводе на экран приведет к переводу курсор» в начало следующей строки.
Логическая функция EOLN. Возвращает TRUE, если во входном текстовом файле достигнут маркер конца строки. Формат обращения:
EOLN<ф.п.>
Если параметр <ф.п.>
Существует некоторое отличие в работе функций EOLN и EOF с дисковыми файлами и логическими устройствами. Дело в том, что для логического устройства невозможно предвидеть, каким будет результат чтения очередного символа. Поэтому при работе с логическим устройством функция EOLN возвращает TRUE, если последним считанным с устройства символом был EOLN или EOF, в то время как при чтении с диска TRUE возвращается в случае, если следующим считываемым символом будет EOLN или EOF. Аналогичное различие наблюдается и в функции EOF: для логического устройства TRUE возвращается в случае, если последним символом был EOF, а при чтении с диска - если следующим считываемым символом будет EOF. Иными словами, функции тестируют соответствующие признаки для логического устройства после очередного чтения, а для файла - перед чтением.
Логическая функция SEEKEOLN.
Пропускает все пробелы и знаки табуляции до маркера конца строки EOLN или до первого значащего символа и возвращает TRUE, если маркер обнаружен. Формат обращения:
SEEKEOLN (<ф.п.>)
Если параметр <ф.п.> опущен, функция проверяет стандартный файл INPUT.
Логическая функция SEEKEOF.
Пропускает все пробелы, знаки табуляции и маркеры конца строки EOLN до маркера конца файла или до первого значащего символа и возвращает TRUE, если маркер обнаружен. Формат обращения:
SEEKEOF (<ф.п.>)
Если параметр <ф.п.> опущен, функция проверяет стандартный файл INPUT.
В следующем примере, иллюстрирующем работу с текстовым файлом, подсчитывается общее количество символов в файле и результат делится на 40000 - таким способом можно оценить объем рукописи в так называемых учетно-издательских листах:
f: text;
s: String;
Const
Sum: LongInt = 0; {Здесь будет количество символов}
Begin
Write("Имя файла: ");{Запрашиваем...}
Readln(s); {и вводим имя файла.}
assign(f,s);
Reset (f); {Открываем файл}
while not EOF(f) do {Подсчитываем...}
begin {количество. . .}
ReadLn(f,s); {символов...}
inc(Sum, Length(s)) {в файле}
end ;
Close(f); {Закрываем файл}
WriteLn("Объем = ", Sum/40000: 6:2," уч.изд.л.")
end.
Набор правил, по которым сохраняются данные в файле, называется форматом файла. Различные типы файлов, такие как текстовые файлы, растровая графика и т.п., используют различные форматы. В общем случае для одного типа файлов может быть определено несколько разных форматов, хотя часто под типом файла и форматом понимают одно и то же. Формат файла определяется по расширению имени файла, которое добавляется к имени файла при его сохранении в определенном формате, например, DOC, GIF и т. д.
Как правило, форматы файлов создаются для использования в строго определенной прикладной программе. Например, графические объекты, создаваемые в известном пакете векторной графики CorelDRAW, сохраняются как файлы с расширением CDR, а изображения, формируемые другим графическим пакетом, CorelXara, записываются на диск как файлы с расширением XAR. Некоторые форматы не связываются с конкретными приложениями, то есть являются универсальными. Одним из наиболее известных универсальных форматов является формат TXT (формат текстовых файлов DOS).
Часто используют сжатие компьютерных файлов для экономии места на носителе. Существует много способов сжатия файлов. Эти способы зависят от исходного формата файлов. Как правило, чем выше степень сжатия, тем медленнее выполняются операции чтения и записи.
Что касается алгоритмов сжатия, то имеются как алгоритмы сжатия без потери данных, так и алгоритмы, при использовании которых потеря данных возможна.
Сжатие без потерь гарантирует, что все данные, которые были в файле до сжатия, будут присутствовать и после распаковки файла. Механизмы сжатия без потерь используются при сохранении текста или числовых данных, например электронных таблиц или файлов документов. Примерами алгоритмов сжатия без потерь могут служить общеизвестные алгоритмы ZIP, ARJ, и другие.
Дадим краткое описание основных используемых форматов:
§ American Standard Code for Information Interchange ASCII (TXT). Формат текстовых файлов, разработанный Американским институтом стандартов (American National Standards Institute). Поддерживается всеми операционными системами и всеми программами. Представляет собой текстовый файл в DOS-кодировке, нет функции вставить рисунок, нет форматирования, работает во всех машинах, возможно создать только файлы малого объема.
§ ANSI (TXT). Формат текстовых файлов в кодировке ANSI (для кодовой страницы Microsoft Windows)
§ MsWord для DOS, Windows (.DOС). Формат документов, разработанный корпорацией Microsoft, поддерживается программами для MS-DOS и большинством текстовых процессоров. Он сохраняет исходное форматирование документов, а также стили начертания символов. Кроме текстовой информации, файлы этого формата могут содержать графические картинки с различными параметрами. Поддерживает 256 цветов. Не поддерживает сжатие. Используется в основном для обмена форматированными текстовыми данными между различными платформами и приложениями.
§ Hypertext Markup Language HTML (HTM, HTML). Язык разметки гипертекстовых документов. Все страницы, расположенные в Internet, созданы с использованием этого специального языка. HTML-документы представляют собой ASCII-файлы, доступные для просмотра и редактирования в любом текстовом редакторе. Отличием от обычного текстового файла является то, что в HTML-документах присутствуют специальные команды-теги, которые определяют правило форматирования документа. Если вам удалось освоить язык HTML, то вы можете создать страницы для Internet. Добавляя теги (метки) к обычному тексту, вы заставляете программу просмотра отображать этот текст определенным образом и размещать на странице изображения. Если вы изучили Java и JavaScript, то знаете, как расширить возможности HTML, помещая внутри тегов команды, написанные на языке сценариев.
§ Portable Document Format PDF (.PDF). Этот формат хранения документов, разработанный фирмой Adobe, претендует на роль открытого типографского стандарта для Web. Он рассматривается как альтернатива HTML. Недостатком HTML является то, что документы, переведенные в HTML, обычно не сохраняют первоначальный формат, причем HTML предлагает при просмотре очень ограниченное число гарнитур. Напротив, пользователи программы Acrobat и PDF-инструментария для создания, распространения и просмотра документов в первоначальном формате, знают, что читатели увидят публикацию именно такой, какой она была сделана. Формат PDF незаменим, если требуется получить точную копию необходимого документа. Как пример успешного применения PDF для документов на русском языке приведем сервер "Московских новостей" в Internet. Представленные на нем в электронном виде материалы полностью повторяют бумажный оригинал, отпечатанный типографским способом.
§ Standard Generalized Markup Language (SGML). Развитие HTML переводится как стандартный язык обобщенной разметки. Представляет собой инструментальный набор механизмов создания структурированных документов, размеченных с помощью дескрипторов (tags). По сравнению с HTML он обеспечивает более гибкие и разносторонние возможности форматирования в Web. Однако SGML отличается и повышенной скоростью, поэтому как более простое средство применяется PDF. Могущество SGML заключается в его межплатформенном структурном подходе к описанию содержания документов. SGML является фактически метаязыком, т.е. предназначен для описания языков разметки, применяемых при создании документов.
Текстовые файлы
Для начала разберемся, что такое текстовые файлы и в чем их различие от двоичных файлов. Текстовые файлы являются подмножеством двоичных файлов, но в отличии от двоичных не могут содержать весь набор символов. Вся информация в файле разбивается на строки, ограниченные символам возврат каретки (CR) и перевод строки (LF). Допустимые символы это символы с кодами от 32 до 255, символы с кодами ниже 32 являются управляющими и допустимы только следующие коды:
· 08 (BS) - возврат на шаг
· 09 (TAB) - табуляция
· 0A (LF) - перевод строки
· 0C (FF) – перевод листа
· 0D (CR) – возврат каретки
· 1A (EOF) – конец файла
Такая ситуация сложилась в стародавние время, когда устройством вывода были телетайпы, затем пишущие машинки и потом появились дисплеи. А каналы связи не позволяли передавать двоичные данные, да и сам они были сначала 5 битные, затем 7 битные и только потом таблицу символов расширили до 8 бит, для поддержки национальных языков и для полной совместимости с компьютерами, где основной единицей был байт. Остальные коды использовались или для управления каналом передачи или для управления специальными устройствами.
Паскаль поддерживает работу с такими файлами, через файловую переменную типа TextFile, где основной единицей является строка, состоящая из основных базовых типов (в текстовом виде, разделенных пробелом), наиболее часто это просто строка, как набор символов. В качестве примера напишем программу преобразования из DOS кодировки (OEM) в Windows (ANSI). Техническое задание:
1. Программа должна работать в консольном режиме и получать входные параметры через командную строку.
2. Программа называется Oem2Ansi
3. На вход поступают два параметра, имя исходного файла и имя выходного файла;
4. Имя выходного файла может быть опущено, в этом случае используется имя входного файла, с изменением расширения выходного на.ANS;
5. Если имена не указаны, то должна выводиться справка о синтаксисе команды;
6. ошибки обрабатывать будем в минимальном объеме, коды ошибок выдаются как ErrorLevel и доступны для обработки в.bat файле.
Текстпрограммы Oem2Ansi
program Oem2Ansi; {$APPTYPE CONSOLE} uses Windows, SysUtils; var InFile: TextFile; OutFile: TextFile; InFilename: string; OutFilename: string; S: string; begin if ParamCount = 0 then begin WriteLn("Syntax is: Oem2Ansi Infile "); Halt(1);// Ошибкасинтаксиса end; InFilename:= ParamStr(1); if ParamCount = 2 then OutFileName:= ParamStr(1) else OutFileName:= ChangeFileExt(InFilename, ".ans"); AssignFile(InFile, InFilename);// связываемвходнойфайл AssignFile(OutFile, OutFilename);// ивыходнойфайл try try Reset(InFile);// открываем входной файл Rewrite(OutFile);// создаем выходной файл while not EOF(InFile) do// крутимпоканеконецфайла begin Readln(Infile, S);// читаемстроку if Length(S) > 0// на вход функции можно then// подавать только не пустые строки begin OemToChar(Pchar(S), Pchar(S)); WriteLn(Outfile, S);// записываемстроку end else begin WriteLn(Outfile);// записываем пустую строку end; end; except Halt(2);// любаяошибка // не удалось преобразовать файлы end; finally CloseFile(InFile); CloseFile(OutFile); end; end. |
Разберем работу программы по кусочкам. Вначале объявляются две файловые переменные текстового типа и две переменные для имен файлов, а также одна переменная для хранения и обработки строки. Затем анализируются входные параметры, если параметры не указываются, то выводится сообщение об ошибки и программа заканчивается с кодом выхода 1. Обратите внимание на форму процедуру WriteLn, если в параметрах не указывается файловая переменная, то вывод производится на консоль, что удобно для выдачи различных сообщений, данная форма возможна только для консольного приложения и не применима в GUI приложении.
После этого первый параметр копируется в переменную InFilename, если параметров два, то второй параметр копируется в переменную OutFilename, иначе используется имя входного файла и изменяется расширение, на расширение по умолчанию.ANS
После этого имена файлов связываются с файловыми переменными. Теперь мы готовы к преобразованию файла, которое будет делаться в двух защищенных блоках, первый блок для защиты ресурсов, а второй блок для защиты от возможных ошибок при работе с файлами, для любых ошибок возвращается код ошибки 2.
Первое действие состоит в открытии файлов, входной файл открывается с помощью процедуры Reset -это открытие текстового файла в режиме чтения, а второй с помощью Rewrite – открытие в режиме записи, если файл существует, то он переписывается. Есть еще одна форма открытия текстовых файлов, это функция Append(FileVar), открытие в режиме добавления строк, если файл существует, то курсор позиционируется в конец файла и файл открывается в режиме записи, если файла нет, то он создается. После нее управление передается в блок finally. В случае ошибки управление сначала передается в блок except, а затем в блок finally.
После этого создается цикл чтения сток пока не будет, достигнут конец файла, или физический или будет встречен символ EOF. Функция EOF(FileVar).
Внутри цикла читается строка во временную переменную Readln(Infile, S) и тут принята одна предосторожность, в функцию Oem2Char НЕЛЬЗЯ передавать пустые строки, поэтому производится анализ длины строки, если строка не нулевая, то производится конвертирования и запись ее в выходной файл, процедурой WriteLn(Outfile, S), иначе в файл пишется пустая строка.
По окончанию цикла или в случае ошибки управление поступает в защищенный блок finally, где оба файла закрываются и управление передается операционной системе.
Домашнее задание - переписать в Ansi2Oem для выполнения обратной функции, с тем же техническим заданием, расширение по умолчанию OEM
Для особо желающих сделать GUI версию, с диалогами выбора файлов, с прогресс-бар, с предварительным просмотром первых 10-20 строк входного файла (переключение кнопкой OEM/ANSI), с целью определения направления перекодирования, с остальными наворотами, которые сумеет придумать душа, например пакетная обработка всех файлов из папки.
Текстовые файлы
Текстовые файлы предназначены для хранения текстовой информации. Именно в таких файлах хранятся, например, исходные тексты программ. Компоненты текстовых файлов могут иметь переменную длину, что существенно влияет на характер работы с ними. Доступ к каждой строке текстового файла Паскаля возможен лишь последовательно, начиная с первой. К текстовым файлам применимы процедуры assign, reset, rewrite, read, write и функция eof. При создании текстового файла в конце каждой записи (строки) ставится специальный признак EOLN(end of line – конец строки). Для определения достижения конца строки существует одноименная логическая функция EOLN(<имя_ф_переменной>), которая принимает значение true, если конец строки достигнут.
Кроме процедур read и write при работе с текстовыми файлами используются их разновидности readln и writeln. Отличие заключается в том, что процедура writeln после записи заданного списка записывает в файл специальный маркер конца строки. Этот признак воспринимается как переход к новой строке. Процедура readln после считывания заданного списка ищет в файле следующий признак конца строки и подготавливается к чтению с начала следующей строки.
Пример решения задачи с файлами
Пусть нам необходимо сформировать текстовый файл, а затем переписать из данного файла во второй только те строки, которые начинаются с буквы «А» или «а».
Решение: нам понадобятся две файловые переменные f1 и f2, поскольку оба файла текстовые, то тип переменных будет text. Задача разбивается на два этапа: первый – формирование первого файла; второй – чтение первого файла и формирование второго, затем вывод на экран содержимого второго файла.
Program primer;
Var f1,f2:text;
I,n: integer;
S: string;
Begin
{формируем первый файл}
Assign(f1, ‘file1.txt’); {устанавливаем связь файловой переменной с физическим файлом на диске}
Rewrite(f1); {открываем файл для записи}
Readln(n) {определим количество вводимых строк}
for i:=1 to n do
begin
readln(s); {вводим с клавиатуры строки}
writeln(f1,s); {записываем последовательно строки в файл}
end;
close(f1); {заканчиваем работу с первым файлом, теперь на диске существует файл с именем file1.txt, содержащий введенные нами строки. На этом программу можно закончить, работу с файлом можно продолжить в другой программе, в другое время, но мы продолжим}
{часть вторая: чтение из первого файла и формирование второго}
Reset(f1); {открываем первый файл для чтения}
Assign(f2, ‘file2.txt’); {устанавливаем связь второй файловой переменной с физическим файлом}
Rewrite(f2); {открываем второй файл для записи}
{Дальше необходимо последовательно считывать строки из первого файла, проверять выполнение условия и записывать нужные строки во второй файл. Для чтения из текстового файла рекомендуется использовать цикл по условию «пока не конец файла»}
While not eof(f1) do
Begin
Readln(f1,s);{считываем очередную строку из первого файла}
If (s=’A’) or (s=’a’) then
Writeln(f2,s); {записываем во второй файл строки, удовлетворяющие условию}
End;
Close(f1,f2); {заканчиваем работу с файлами}
{часть третья: выводим на экран второй файл}
Writeln;
Writeln(‘Второй файл содержит строки:’);
Reset(f2); {открываем второй файл для чтения}
While not eof(f2) do {пока не конец второго файла}
Begin
Readln(f2,s);{считываем очередную строку из второго файла}
Writeln(s); {выводим строку на экран}
End;
End.
Задача 1: Дан текстовый файл. Посчитать количество строк в файле.
- Открыть файл для чтения;
- Организовать считывание данных из файла построчно (readln(f,s), где s-переменная типа string), насчитывая на каждом шаге считывания значение переменной-счетчика k;
- Вывести на экран значение переменной-счетчика;
- Закрыть файл.
program z1;
var k:integer;
s:string;
f:text;
begin
assign(f,"input.pas");
reset(f);
k:=0;
while not eof(f) do begin
readln(f,s); k:=k+1;end;
writeln("k=",k);
close(f);
end.
Задача 2: Дан текстовый файл. Напечатать все его строки, начинающиеся с символа «Т».
Составим алгоритм решения задачи (Создать текстовый файл данных – input.pas до начала решения задачи):
- Связать логический файл f с физическим файлом input.pas;
- Открыть файл для чтения;
- Организовать считывание данных из файла построчно (readln(f,s), где s-переменная типа string), проверяя на каждом шаге, удовлетворяет ли строка условию: первый символ равен «Т», и если да, то вывести эту строку на экран;
- Закрыть файл.
program z2;
var k:integer;
s:string;
f:text;
begin
assign(f,"input.pas");
reset(f);
while not eof(f) do begin
readln(f,s);
if s=’T’ then writeln(s);
end;
close(f);
end.
Задача 3: Дан текстовый файл. Напечатать все его строки, содержащие более 30 символов.
Составим алгоритм решения задачи (Создать текстовый файл данных – input.pas до начала решения задачи):
- Связать логический файл f с физическим файлом input.pas;
- Открыть файл для чтения;
- Организовать считывание данных из файла построчно (readln(f,s), где s-переменная типа string), проверяя на каждом шаге, удовлетворяет ли строка условию: длина строки больше 30, и если да, то вывести эту строку на экран;
- Закрыть файл.
program z3;
var k:integer;
s:string;
f:text;
begin
assign(f,"input.pas");
reset(f);
while not eof(f) do begin
readln(f,s);
if length(s)>=30 then writeln(s);
end;
close(f);
end.
Задача 4: Дан текстовый файл. Напечатать все его строки, содержащие в качестве фрагмента заданный текст.
Составим алгоритм решения задачи (Создать текстовый файл данных – input.pas до начала решения задачи):
- Связать логический файл f с физическим файлом input.pas;
- Открыть файл для чтения;
- Задать фрагмент текста для поиска (s1);
- Организовать считывание данных из файла построчно (readln(f,s), где s-переменная типа string), проверяя на каждом шаге, удовлетворяет ли строка условию: в ней содержится в качестве фрагмента заданный текст (s1), и если да, то вывести эту строку на экран;
- Закрыть файл.
program z4;
var k:integer;
s1,s:string;
f:text;
begin
writeln(‘введи фрагмент текста ’);
readln(s1);
assign(f,"input.pas");
reset(f);
while not eof(f) do begin
readln(f,s);
if pos(s1,s)<>0 then writeln(s);
end;
close(f);
end.
Задача 5: Дан текстовый файл. Напечатать 5 строку в новый текстовый файл, а остальные на экран.
Составим алгоритм решения задачи (Создать текстовый файл данных – input.pas до начала решения задачи):
- Связать логический файл f с физическим файлом input.pas, а логический файл g с физическим файлом output.pas;
- Открыть файл для чтения;
- Организовать считывание данных из файла построчно (readln(f,s), где s-переменная типа string), насчитывая на каждом шаге считывания значение переменной-счетчика k, и, проверяя на каждом шаге, равно ли значение счетчика 5, и если да, то вывести эту строку в файл g, иначе вывести на экран;
- Закрыть файл.
program z5;
var k:integer;
s:string;
f,g:text;
begin
assign(f,"input.pas");
reset(f);
assign(g,"output.pas");
rewrite(g);
k:=0;
while not eof(f) do begin
readln(f,s);k:=k+1;
if k=5 then writeln(g,s);
end;
close(f); close(f);
Текстовый файл можно рассматривать как последовательность символов, разбитую на строки длиной от 0 до 256 символов. Это файлы последовательного доступа. Структурной единицей текстовых файлов является строка. Данные в таких файлах хранятся в виде цепочки ASCIIкодов и могут обрабатываться любым текстовым редактором. Каждая строка завершается маркером конца строки. На практике такой маркер представляет собой последовательность из двух символов: перевод строкиchr(10)и возврат кареткиchr(13). Эти два символа задают стандартные действия по управлению текстовыми файлами.
Текстовые файлы описывается в разделе описания переменных:
Файловая_переменная: TextFile;
Файловая переменная – это имя переменной, которое используется в программном коде для работы с файлом.
Открытие текстового файла
Перед тем, как записать данные в файл или прочитать данные из файла, необходимо сначала открыть этот файл. Открытие текстового файла на запись, чтение или дозапись осуществляется с помощью разных процедур. Но прежде, чем их использовать, необходимо во всех случаях присвоить файлу на магнитном носителе имя, т.е. поставить в соответствие файловой переменной имя файла на диске с помощью процедуры AssignFile :
AssignFile(файловая переменная, имя файла),
Здесь имя файла - любое выражение строкового типа, которое строится по правилам определения имен в операционной системе.
Например:
AssignFile(F,’c:\Student\Primer.Txt’);
Процедуры для открытия текстовых файлов
Обращение к процедуре |
Действие |
|
Открывает (создает) новый файл. Имя файла предварительно определяется в процедуре AssignFile.Если на диске уже был файл с таким именем, то он уничтожается. |
||
Открывает уже существующий файл. Файл считывается последовательно. Если эта процедура применена к несуществующему файлу, то возникает ошибка ввода-вывода. |
||
Открывает уже существующий файл для дозаписи. Запись производится в конец файла. |
||
В таблице F– имя файловой переменной. |
Обработка текстовых файлов
У текстовых файлов есть своя специфика. Специальные расширения стандартных процедур чтения (Read) и записи (Write), описанных ниже, разрешают работать со значениями несимвольного типа. Другими словами, последовательность символов автоматически преобразуется к значению того типа переменной, которая используется в файловых операциях.
Вызов Read(F,Ww),гдеWw- переменная типаword, осуществляет чтение из файлаFпоследовательности цифр, которая затем интерпретируется в число, значение которого и будет присвоено переменнойWw. В случае, если вместо последовательности цифр идет любая другая последовательность символов, использование такого оператора приводит к ошибке выполнения программы.
В таблице F– имя файловой переменной.V1,V2,…,Vn– переменные разных типов.
Обращение к процедуре |
Действие |
Read(F,V1[,V2,…,Vn]); |
Считывает из дискового файла строки символов в переменные V1, V2,…,Vn. |
Readln(F,V1[,V2,…,Vn]); |
Read , и дополнительно – чтение до маркера конца строки и переход к новой строке Readln (F ) без списка переменных позволяет пропустить строку в файле и перейти на новую строку. |
Write(F,V1[,V2,…,Vn]); |
Записывает значения переменных V1,V2,…,Vn в файл на диске. |
Writeln(F,V1[,V2,…,Vn]); |
Выполняет те же действия, что и Write , но обеспечивает запись всех величин с обязательной установкой маркера конца строки в файл. Writeln (F ) без списка переменных. записывает в файл пустую строку. |