Робота з дисковими файлами

Найбільш поширеним видом файлів є іменовані області зовнішньої (дискової) пам'яті, із якими програми можуть обмінюватися інформацією. Необхідність у таких обмінах виникає, коли обсяг оперативної пам'яті недостатній зберігання потрібної інформації. В іншій ситуації, наприклад, програма може скористатися даними, отриманими раніше іншою програмою та завбачливо записаними на диск. До абонентів, що беруть участь в обміні даними, відносяться і файли-пристрою: дисплей, принтер, графобудівник, сканер, клавіатура, канали зв'язку і т. п. Цей розділ присвячений роботі з дисковими файлами, хоча технологія обслуговування файлів-пристроїв принципово мало відрізняється.

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

  • виділення ресурсів та приведення файлу в стан готовності до обміну (саме це ховається за терміном "відкрити файл");
  • читання (введення з файлу) або запис (виведення у файл) чергової порції даних;
  • повернення виділених ресурсів та завершення незакінчених операцій (цьому відповідає термін "закрити файл").

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

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

  • "S1S2S3.. .Sk" (змінна кількість символів, укладених в одинарні або подвійні лапки);
  • kS1S2.. .Sk (k — однобайтовий або двобайтовий покажчик числа символів, що передує тексту);
  • S1S2. Sk\0 (\0 — однобайтова ознака кінця рядка, розташована за останнім символом тексту);
  • S1S2. Sk OD ОА (двобайтова ознака кінця рядка, OD - "повернення каретки", ОА - "переведення рядка").

Числова інформація може бути записана в дисковий файл або в машинному форматі (а в Сі та Паскалі кількість різних типів числових даних досягає десятка), або з попереднім перетворенням з машинного подання на символьне.

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

Крім того, існує кілька способів доступу до файлових даних, з яких на практиці найчастіше використовують два – послідовний та довільний. Останній іноді називають прямим (DIRECT ACCESS) чи випадковим (RANDOM ACCESS). Послідовний доступ при запису на диск характерний тим, що чергова порція, що записується, прилаштовується в хвіст до попередньої. Розміри суміжних порцій при цьому можуть виявитися різними по довжині. При читанні такий набір даних починає вилучатися з першої порції ічерговість даних, що зчитуються, повторює їх послідовність під час запису.

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

Основні типи файлів у системі QBasic

Система QBasic підтримує роботу з файлами трьох типів - рядковими, записорієнтованими і двійковими. Наведені терміни є загальновживаними, проте вони досить точно відображають формат зберігання даних у дискових файлах.

Рядкові файли в системі QBasic

У рядковому файлі умовною порцією зберігання даних є рядок змінної довжини, що завершується двома керуючими байтами з кодами OD ("повернення каретки") та OA ("переклад рядка"). Рядок файлу може бути порожнім, або містити одне або кілька числових і символьних значень. Символьне значення або завершується комою, або полягає у подвійні лапки. Числові значення представлені у символьному форматі і завершуються або комою, або пропуском. Останнє значення файлового рядка завершується парою керуючих кодів ODOA.

Рядковий файл послідовного доступу для виведення відкривається за допомогою наступного оператора:

OPEN ім'я_файлу FOR OUTPUT AS #k

Якщо ми збираємося додавати інформацію до вже існуючого рядкового файлу, то його відкривають із зазначенням FOR APPEND. Файл, з якого інформація повинна зчитуватись, відкривається із зазначенням FOR INPUT.

Відкриваєтьсяфайлу програміст присвоює числовий номер з діапазону [1,255], який згодом замінює ім'я файлу в операторах введення (INPUT) або виведення (PRINT, WRITE). Символ tt може зменшуватися.

Закривається рядковий файл оператором CLOSE tk.

Виведення в рядковий файл зазвичай здійснюється за оператором WRITE Ik. При такому виведенні кожне текстове значення автоматично полягає в лапки і всі дані розділяються комами. Читання даних із рядкового файлу здійснюється за допомогою оператора INPUT #k і нічим принципово не відрізняється від введення даних із рядка, що набирається користувачем на клавіатурі.

У принципі, у рядковий файл можна зробити запис і оператор PRINT#k. Однак при цьому текст, що виводиться в лапки не полягає і роздільні коми між окремими значеннями не вставляються. Якщо рядку файлу виявляється кілька текстових і числових значень, їх потім буде важко витягти. Колізії такого роду демонструє програма 7_01.bas.

CLS : DEFINT A-Z: А$="Рядок" OPEN "bas_txt"