Програмування в
ІТ профілі
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Поиск
Календарь
«  Апрель 2024  »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
2930
Друзья сайта
  • Создать сайт
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Все проекты компании
  • Воскресенье, 28.04.2024, 00:35
    Приветствую Вас Гость | RSS
    Главная | Регистрация | Вход
    Текстові файли

    За матеріалами з книги В.В. Фаронова «Turbo Pascal 7.0. Учебный курс» 

     

    Текстові файли зв'язуються з файловими змінними, що належать стандартному типом text . Текстові файли призначені для зберігання текстової інформації. Саме у файлах такого типу зберігаються, наприклад, вихідні тексти програм. Компоненти ( записи) текстового файлу можуть мати змінну довжину, що істотно впливає на характер роботи з ними.

    Текстовий файл трактується в Турбо Паскалі як сукупність рядків змінної довжини. Доступ до кожного рядка можливий лише послідовно, починаючи з першої . При створенні текстового файлу в кінці кожного запису (рядки ) ставиться спеціальний ознака EOLN ( End OfLiNe - кінець рядка), а в кінці всього файлу - ознака EOF ( End Of File - кінець файлу) . Ці ознаки можна протестувати однойменними логічними функціями ( див. далі). При формуванні текстових файлів використовуються наступні системні угоди :

    □ EOLN - послідовність ASCII - кодів # 13 (CR ) і # 10 ( LF) ;

    □ EOF - ASCII -код # 26.

    ПРИМІТКА

    Для зберігання рядків фіксованої довжини можна використовувати типізовані файли, наприклад, вказавши їх пропозицією file of String . У цьому випадку кожна запис у файлі має строго однаковий розмір ( 256 байт), навіть якщо сама рядок не містить жодного символу. Якщо файл відноситься до стандартного текстового файлу ( text ), його записи мають змінну довжину. Зокрема, якщо в рядку немає жодного символу, відповідний запис у файлі буде складатися з байтів CR і LF, тобто довжина такого запису - 2 байти .

     

    Для доступу до записів застосовуються процедури 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, < - ;

    □ відновлення попередньої рядка введення символ за символом ;

    □ завершення введення за процедурою Read ( залишилися «зайві» символьні параметри приймають значення CHR ( 26 ), рядки повертаються порожніми, а чисельні змінні залишаються без змін) - Ctrl + Z, Enter .

    Максимальна довжина буфера введення при роботі з клавіатурою складає 127 символів . Введення з клавіатури за процедурою Read супроводжується ехо- повтором символів, що вводять на екрані комп'ютера.

    Процедура Read прекрасно пристосована до введення чисел. При зверненні до неї за введенням чергового цілого або дійсного числа процедура « перескакує » маркери кінця рядків, тобто фактично весь файл розглядається нею як одна довга рядок, що містить текстове представлення чисел. У поєднанні з перевіркою кінця файлу функцією EOF процедура Read дозволяє організувати простий введення масивів даних, наприклад, так як показано в лістингу 6.2 .

    Лістинг 6.2 . Введення масиву дійсних чисел

    const

          N = 100 0 ; { Максимальна довжина введення }

    var

          f : text ;

          m : array 1 .. N of real;

          i : Integer;

    begin

          assign ( f, 1 prog . dat1 ) ;

          reset ( f );

          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 починається з першого символу нового рядка. Крім того, цю процедуру можна викликати без параметра < сп.ввода > (див. опис процедури Read), що призведе до пропуску всіх символів поточного рядка аж до EOLN .

    Якщо процедура використовується для читання з клавіатури, натискання клавіші Enter відобразиться на екрані як послідовність CR і LF, після чого курсор буде поміщений на початок наступного рядка, в той час як у процедурі Read луна - повтором клавіші Enter є символ CR, а курсор поміщається в початок поточного рядка .

    Процедура Write забезпечує виведення інформації в текстовий файл або передачу її на логічний пристрій . Формат звернення:

                Write ( < ф.з.>, < сп.вивода > ) АБО

                Write ( < сп.вивода > )

    Тут < сп.вивода > - список виведення, тобто послідовність з одного або більше виразів типу Char, String, Boolean, а також будь-якого цілого або дійсного типу .

    Файлова змінна < ф.з.>, якщо вона вказана, повинна бути попередньо описана як змінна типу text і пов'язана з ім'ям файлу або логічним пристроєм процедурою assign . Якщо файлова змінна відсутня, мається на увазі висновок у стандартний файл output, який зазвичай пов'язаний з екраном комп'ютера.

    Будь-який елемент списку висновку може мати форму

    OutExpr [ : MinWidth [ : DecPlaces ]]

    Тут OutExpr - виведене вираз ; MinWidth, DecPlaces -вирази типу Word (квадратні дужки означають можливість відсутності ув'язнених у них параметрів).

    Подпараметр MinWidth, якщо він присутній, вказує мінімальну ширину поля, в яке буде записуватися символьне представлення значення OutExpr . Якщо символьне уявлення має меншу довжину, ніж MinWidth, воно доповнюється зліва пропусками, якщо більшу довжину, то подпараметр MinWidth ігнорується і виводиться необхідну кількість символів .

    Подпараметр DecPlaces задає кількість десяткових знаків у дробовій частині дійсного числа . Він може використовуватися тільки спільно з MinWidth і тільки по відношенню до виводиться висловом одного з речових типів .

    Якщо ширина поля виводу не вказана, відповідний параметр виводиться слідом за попереднім без будь-якого їх поділу .

    Символи і рядки передаються вихідного файлу без змін, але забезпечуються провідними пробілами, якщо задана ширина поля виводу і ця ширина більше необхідної для виводу.

    При виведенні логічних виразів залежно від їх значення виводяться рядки TRUE або FALSE . Введення логічних констант процедурами Read або ReadLn не передбачений.

    Речові числа виводяться в експоненційному форматі, якщо не вказано подпараметр DecPlaces, в іншому випадку вибирається формат подання числа з фіксованою крапкою. Експонентний формат представляє дійсне число у вигляді

    _s # . # # # # # # # # # # # # # # E * # # # #

    Тут __ - пробіл ; 5 - пробіли для позитивного числа і знак мінус (-) для негативного ; # - десяткова цифра ; Е - символ десяткового підстави ; * - знак плюс (+) або мінус ( - ) залежно від знака десяткового порядку числа .

    Якщо подпараметр MinWidth опущений, приймається його замовчувана значення (23). Якщо MinWidth менше 10, вважається, що він дорівнює 10 .

    Якщо подпараметр DecPlaces дорівнює нулю, ні дробова частина числа, ні десяткова крапка не виводяться . При від'ємному значенні DecPlaces цей параметр ігнорується, і число виводиться в експоненційному форматі з урахуванням MinWidth . Якщо значення DecPlaces більше 18, приймається значення 18 . Слід врахувати, що при вказівці подпараметра DecPlaces дійсне число завжди буде виводитися в форматі з фіксованою точкою і необхідною кількістю знаків у дробовій частині, навіть якщо значення подпараметра MinWidth виявиться недостатнім для розміщення цілої частини : у цьому випадку значення MinWidth автоматично збільшується.

    При виведенні на екран в разі, коли довжина виведеної послідовності символів перевищує ширину екрану або створеного на ньому вікна, «зайві» символи переносяться на наступну екранну рядок. При заповненні екрану або вікна його вміст зсувається вгору на один рядок.

    Процедура WriteLn повністю ідентична процедурі Write за винятком того, що виводиться рядок символів завершується кодами CR і LF . При виклику WriteLn можна опускати параметр < сп.вивода > \ в цьому випадку у файл передається маркер

    EOLN, що при виведенні на екран веде до перекладу курсору на початок наступного рядка .

    Логічна функція EOLN повертає True, якщо у вхідному текстовому файлі досягнуто маркер кінця рядка. Формат звернення:

    EOLN ( < ф.з.> )

    Якщо параметр < Ф.П > опущений, функція перевіряє стандартний файл input .

    Існує деяка відмінність у роботі функцій EOLN і EOF з дисковими файлами і логічними пристроями. Справа в тому, що для логічного пристрою неможливо передбачити, яким буде результат читання чергового символу . Тому при роботі з логічним пристроєм функція EOLN повертає True, якщо останнім ліченим з пристрою символом був EOLN або EOF, в той час як при читанні з диска True повертається у разі, якщо наступним зчитуватися символом буде EOLN або EOF . Аналогічне різниця спостерігається і у функції EOF : для логічного пристрою True повертається у разі, якщо останнім символом був EOF, а при читанні з диска - якщо наступним зчитуватися символом буде EOF . Іншими словами, функції тестують відповідні ознаки для логічного пристрою після чергового читання, а для файлу - перед читанням .

    Логічна функція SeekEOLN пропускає всі прогалини і знаки табуляції до маркера кінця рядка EOLN або до першого значущого символу і повертає True, якщо маркер виявлений . Формат звернення:

    SeekEOLN ( < ф.з.> )

    Якщо параметр < Ф.П > опущений, функція перевіряє стандартний файл input .

    Логічна функція SeekEOF пропускає всі прогалини, знаки табуляції і маркери кінця рядка EOLN до маркера кінця файлу або до першого значущого символу і повертає True, якщо маркер виявлений . Формат звернення:

    SeekEOF ( < ф.з.> )

    Якщо параметр < Ф.П > опущений, функція перевіряє стандартний файл input .

    У наступному прикладі (лістинг 6.3), що ілюструє роботу з текстовим файлом, підраховуєтеться загальна кількість символів у файлі і результат ділиться на 40. Таким способом можна оцінити обсяг рукопису в так званих обліково-видавничих аркушах.

    Лістинг 6.3, Визначення обсягу рукопису

    var

          f : text;

          s : String;

    const

          Sum : Longlnt = 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 .

    У лістингу 6.4 представлена ​​програма, яка створює текстовий файл і наповнює його вводяться з клавіатури рядками . Після закінчення введення (Ctrl + Z, Enter ) читає всі введені рядки і виводить їх на екран.

    Лістинг 6.4 . Ілюстрація створення, наповнення і читання текстового файлу

          f : Text;

          S : String;

    begin

          assign ( f, • Strings . txt '); { Створюємо новий файл }

          rewrite ( f ) ;

          while not EOF do { Наповнюємо його до введення Ctrl + Z і Enter }

          begin

                ReadLn (S );

                Writeln ( f, S );

          end ;

          Close ( f ) ; { Закриваємо файл }

          reset ( f ) ; { Відкриваємо для читання }

          while not EOF ( f ) do { Читаємо файл }

          begin

                ReadLn ( f, S );

                WriteLn (S );

          end ;

          Close ( f )

    end.

     

     

    Куликівська ЗОШ І-ІІІ ст. © 2024
    Сделать бесплатный сайт с uCoz