РОБОТА З послідовний файл

Між читанням послідовного файлу і діями оператора READ (див розд 44), що читає послідовний список елементів даних,

ранених в операторах DATA, існує чимала схожість У разі файлу замість оператора READ використовується розширений варіант оператора INPUT, а елементи даних зникають з поля зору і запамятовуються аналогічним чином в послідовному файлі

Щоб забезпечити гнучкість маніпулювання файлами, в Бейсике використовується ідея логічного номера, привязаного до файлу, завдяки чому у всіх операторах читання і запису, що працюють з цим файлом, достатньо вказувати тільки його логічний номер Перед початком роботи з файлами або перед виконанням програми за допомогою одного оператора або команди (наприклад, OPEN) здійснюється привязка існуючого файлу до логічного номеру, наприклад:

10 REM ПРИКЛАД РОБОТИ З ФАЙЛОМ

20   OPEN 1,1,0,&quotINFO&quot

30   INPUT #1,A,B,C

Наведений вище приклад специфічний для конкретної системи (PET), але проте ілюструє привязку в рядку 20 файлу INFO до логічного номеру 1 (перша одиниця після OPEN) У рядку 30 показаний розширений оператор INPUT, що зчитує значення змінних А, В і С з файлу, привязаного до номера 1 Деталі відкриття файлу і його привязка до логічного номеру будуть приведені в наступних розділах даної глави Перед виконанням прикладів можна звернутися до відповідного розділу в залежності від використовуваної Вами системи і носія інформації архівної памяті

Позначення логічного номера файлу

Загальна форма запису:

#N: або #N,

де N целочисленное вираз, змінна або константа

У деяких системах існують обмеження для номера N, наприклад: 1 &lt=N&lt=15 для Бейсика

Microsoft, 1&lt=N&lt=255 для персональної ЕОМ PET, 1&lt=N&lt=6 для ЕОМ ICL 2904

Крім того, для загального числа одночасно відкритих файлів операційною системою встановлюється межа, зазвичай менший 10

зауваження Бейсік ВВС відрізняється тим, що значенняN  не вибирають програмістом, а надається системою при привязці файлу до програми

Наведені нижче оператори можуть застосовуватися для роботи з послідовно-

тельним файлом, якщо додавати в них позначення логічного номера файлу: INPUT # N, LINPUT # N, LINEINPUT # N, GET # N, PRINT # N, PRINT # N, USING

Наведемо приклад програми, дії якої складаються з двох етапів На першому відбувається запис в простий файл, а на другому – зчитування даних назад в память і зображення їх на ВТУ Так як Ви не є можете бачити, що саме запомнено у файлі на стрічці або диску, то треба мати кошти перевірки його вмісту, що і забезпечується другою частиною програми

10 REM СТВОРЕННЯ І ПЕРЕГЛЯД ФАЙЛА

20 REM ** ЗАМІНІТЬ ЦЕЙ КОМЕНТАР НА ОПЕРАТОР OPEN **

30 FOR I = 1 ТО 50

40   PRINT «2,I*I

50 NEXT I

60 CLOSE 2

70 PRINT файлі записано

80 PRINT

90 PRINT перемотати СТРІЧКУ і наберіть RUN 120 100 STOP

110 REM перегляду файлів

120 REM ** ЗАМІНІТЬ ЦЕЙ КОМЕНТАР НА ОПЕРАТОР OPEN **

130 FOR K=1 TO 50

140   INPUT #3,X

150   PRINT X

160 NEXT До

170 CLOSE 3

180 END

Рядки 20 і 120 повинні бути замінені на відповідні оператори OPEN для роботи з одним і тим же файлом Для ілюстрації логічний номер 2 використаний під час запису у файл, а 3 – при читанні з нього цей вибір абсолютно довільний

В системі ВВС треба використовувати оператори

40 PRINT # N, I * I і 140 INPUT # N, X

де N береться з операторів OPEN (див підрозд 844) Так як в системі ВВС в операторі RUN номер рядка вказати не можна, то наведену вище програму найкраще розбити на дві: одну скласти з рядків 10-100, а іншу – з рядків 110-180

Дія першої частини програми полягає в запису квадратів чисел від 1 до 50 у файл Кожен оператор PRINT додає в файл новий запис (візуально її можна представляти у вигляді рядка) За командою RUN програма

почне виконувати зазначені дії і зупиниться, видавши наведене нижче повідомлення У команді RUN можна вказати номер рядка, з якою має розпочатися виконання програми, що й робиться в нашому випадку для виконання другої частини програми:

RUN

Файл записано

Перемотати СТРІЧКУ І ДАЙТЕ КОМАНДУ RUN 120

RUN 120

1 4 9 16 25 36 49 64 81 100 121 144 169 (і т д)

Ви можете помітити невелику паузу в процесі виведення після зображення частини чисел на екрані ВТУ Вона викликається буферизацией, яка в тому чи іншому вигляді застосовується при роботі з усіма файлами даних У всіх системах для кожного пристрою виводу в памяті виділяється буферна область У мікроЕОМ розмір цієї області зазвичай становить 128 або 256 байт Дані, які повинні бути записані у файл, збираються в цій буферній області до її заповнення, потім все зміст буфера цілим блоком передається пристрою Після цього буфер готовий прийняти нові дані і т д Аналогічним чином при введенні кожний фізичний блок, що зчитується в ЕОМ, потрапляє в буфер програма читає дані з цього буфера до тих пір, поки він не стане порожнім, після чого з стрічки або диска зчитується новий блок Згадана вище пауза свідчить про те, що програма чекає, поки буфер не заповниться новими даними, зчитуваними із зовнішньої памяті на стрічці або диску Один із способів уникнути подібної нерівномірності дій – застосування двох буферів таким чином, щоб один з них заповнювався даними в той час, коли з іншого витягуються дані, і навпаки Однак такий режим засобами Бейсика здійснити не можна

Модифікуємо попередню текстову програму так, щоб при виведенні і читанні в кожному записі файлу було по два значення:

10 REM РОБОТА З ФАЙЛОМ ПРИКЛАД 2

20 КИМ «« «ЗАМІНІТЬ ЦЕЙ КОМЕНТАР НА ОПЕРАТОР OPEN ***

30 FOR I = 1 то 50

40   PRINT #2,1&quot,"100*I

50 NEXT I

60   CLOSE 2

70 PRINT файлі записано

80   PRINT

90 PRINT перемотати СТРІЧКУ і наберіть RUN 120

100 STOP

110 REM перегляду файлів

120 Rем *** ЗАМІНІТЬ ЦЕЙ КОМЕНТАР НА ОПЕРАТОР OPEN ***

130 FOR K=1 TO 50

140   INPUT #3,X,Y

150   PRINT X,Y

l60 NEXT K

170 CLOSE 3

180 END

RUN

Файл записано

Перемотати СТРІЧКУ і наберіть RON 120

RUN 120

1&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp 400 (і т д)

Результати виконання відповідають очікуваним, оскільки в рядку 40 виводяться два значення, I і 100 * I, а в рядку 140 вони зчитуються назад Повернемося до рядка 40 і звернемо увагу на те, що у файл надсилається також значення ,. Це робиться тому, що оператори INPUT # і PRINT # фактично працюють так само, як і вихідні версії INPUT і PRINT Це означає, що оператор INPUT очікує в одній рядку (або записи) отримати всі значення, розділені комами Наприклад, оператор

10 INPUT SUM, ТОЙ, Е очікує отримання введення з клавіатури у формі

? 10,-6,42

Той ж відноситься і до файлів Якщо коми відсутні, то більшість систем з Бейсиком ігнорує проміжні прогалини, в результаті чого числа зливаються Спробуйте отримати подібний ефект, видаляючи кому з рядка 40 і використовуючи оператор

40 PRINT # 2, I 100 * I Запустивши програму знову, Ви отримаєте

RUN

Файл записано

Перемотати СТРІЧКУ І ДАЙТЕ КОМАНДУ RUN 120

RUN 120

1100      2200 3300      4400

(І т д) ERROR AT LINE 140

Повідомлення про помилку викликано тим, що через відсутність коми програм вважає, що в кожному записі міститься тільки один елемент даних, та що рядок 140 зчитує один запис у X, а іншу в Y і після виконання половини загального числа проходів циклу намагається вважати дані за кінцем файлу

Важливо мати можливість виявляти кінець файлу, так як на практиці точне число елементів даних у файлі не відомо У деяких системах для виявлення кінця файлу передбачена функція EOF ():

Бейсік Microsoft: EOF (N) = -1 (ІСТИНА), якщо досягнуто кінець файлу Бейсік ВВС: EOF # (N) = -1 (ІСТИНА), якщо досягнуто кінець файлу В інших системах для цього передбачений спеціальний оператор IF:

ICL 2904: IF END# 1 GOTO 200

У деяких системах є спеціальне слово стану, значення якого залежить від реакції системи на кожен обмін даними У персональній ЕОМ PET є слово стану ST (розміром в 1 байт), і при різних реакціях в цьому слові встановлюються (тобто приймають значення 1) різні біти:

PET: СЛОВО СТАНУ ST = 0, якщо все в порядку

= 64, якщо від касетного магнітофона отриманий сигнал кінця файлу

100 REM ФРАГМЕНТ РОБОТИ З ФАЙЛОМ ДЛЯ ЕОМ PET

110 INPUT # 2, А, В, С

120   IF ST=0 THEN 200

130   IF ST=64 THEN 500

Перехід до рядка 200 відповідає нормальній обробці, а до рядка 500 – діям, виконуваних при виявленні кінця файлу Слово стану має ту перевагу, що в ньому можна відзначати цілий спектр можливих реакцій і тим самим робити їх доступними програмі на Бейсике Використовуючи функцію Бейсика ВВС, можна навести приклад виявлення кінця файлу, що містить список прізвищ і чисел Тут був би потрібен цикл DO WHILE NOT EOF # N, але в Бейсике ВВС його немає

100 REM ЧИТАННЯ ДАНИХ З ФАЙЛА ВВС З логічний номер N

110 IF EOF#(N) THEN

120 INPUT#N , NAME$ , NUMB

. Процес введення

200   GOTO   110

210 REM ВИХІД ПРИ ВИЯВЛЕННЯ КІНЦЯ ФАЙЛА

220   CLOSE#N

Зверніть увагу на деяку відмінність оператора CLOSE в Бейсике ВВС від зазвичай використовуваної форми

831 ФАЙЛИ НА МАГНІТНОЇ касети

Оскільки процес передачі блоків є переривчастим, на відміну від безперервного читання або запису при роботі з програмними файлами, то

використовуваний для роботи з файлами даних магнітофон повинен управлятися ЕОМ Для цього ЕОМ, як мінімум, повинна мати можливість включати і вимикати двигун стрічкопротяжного пристрої після ручного включення магнітофона на читання або запис Добре, якщо при цьому

ЕОМ вміє розбиратися в тому, яка з клавіш була натиснута (якщо була), але найкраще, якщо ЕОМ володіє можливістю повного управління читанням, записом і перемоткою стрічки

Звичайна процедура роботи з файлом така: коли після запуску програми досягається оператор OPEN (або аналогічний йому), то система повинна зажадати включення магнітофона Під управлінням ЕОМ двигун стрічкопротяжного пристрою повинен включатися і вимикатися при кожній передачі даних, і так до тих пір, поки, нарешті, не буде досягнутий оператор CLOSE Нижче на прикладі двох систем проілюстровані загальні властивості процесу роботи з файлами даних на касеті

Джерело: Уолш Б Програмування на Бейсике: Пер з англ М: Радіо і звязок, 1988 336 с: ил

Схожі статті:


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

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*