10. Читання і запис файлів даних.
Під власними даними ми послідовно розглянемо запис вмісту числових векторів і матриць, текстових рядків, структур і масивів осередків.
Почнемо з числових векторів і матриць. Працювати будемо з так званими бінарними (НЕ текстовими) файлами, які спочатку треба відкрити за допомогою призначеної для цього функцією fopen системи MATLAB:
де ім'я файлу може передувати повним шляхом до нього (інакше файл повинен розташовуватися в поточному каталозі MATLABа). Другий параметр цієї функції - так званий прапор відкриття файлу, говорить про спосіб подальшої роботи з файлом:
'Wb' - тільки для запису (попереднє вміст втрачається)
Друга буква в цих прикладах говорить про бінарному характері файлів. Можливий ще прапор, що дозволяє як читання, так і запис файлів одночасно ( 'r +'), але ми його тут використовувати не будемо.
Функція fopen повертає числовий ідентифікатор відкритого файлу, який треба використовувати в якості параметра для функцій читання і запису в цей файл. Якщо операція відкриття файлу не вдалася (це можливо як через відсутність файлу, так і через неправильне вказівки шляху до нього на диску), то функція fopen повертає -1.
Завжди слід перевіряти повернення функції fopen:
error ( 'File is not opened')
Після того, як файл більше не потрібно, його слід закрити функцією fclose:
Читання і запис інформації в бінарні файли здійснюється функціями fread і fwrite. Функція fwrite, призначена для запису інформації в файли, має такі аргументи:
де fid - файловий ідентифікатор, що повертається функцією fopen; A - вектор або матриця, чиї елементи підлягають записи в файл; рядок 'precision' говорить про розмір пам'яті, що відводиться під речові числа. Це 8 байт або 64 біта, так що рядок повинен мати вигляд 'float64'.
У наступному фрагменті коду створюються вектор-стовпець a і матриця B розміром 2x3, які потім записуються в файл з ім'ям 'dataTest.gqw' (тут розширення імені файлу вибрано довільно так, щоб не збігтися з відомими розширеннями):
Тепер завжди, коли це буде потрібно, можна прочитати з файлу збережені там значення вектора і матриці. Що і ілюструє наступний фрагмент коду:
Останній з наведених нами фрагментів коду страждає рядом практичних недоліків, які яскраво висвітлюють проблеми, з якими доводиться стикатися при роботі з файлами (особливо, бінарними). По-перше, ми лише для стислості викладу не застосовуються перевірку правильності відкриття файлу, про яку ми вже говорили вище.
Для відстеження позиції файлового покажчика і роботи з ним служать функції feof (служить для індикації кінця файлу), fseek (встановлює файловий покажчик), ftell (дозволяє дізнатися значення поточного файлового покажчика), frewind (встановлює файловий покажчик на началдо файлу). Всі ці функції мають прозорий сенс, тому ми їх детально не розглядатимемо. Про них завжди можна дізнатися в довідковій системі MATLABа.
Тепер поговоримо трохи про записи рядків. Поки що ми працювали з бінарними файлами. Іншим типом файлів є текстові файли. Вони спеціально пристосовані для запису великих фрагментів тексту, оскільки цих файлів органічно притаманне "розуміння" поділу тексту на рядки (в самому що ні на є книжковому сенсі цього слова), а бінарні файли цього "не розуміють". Останні працюють тільки з потоком байт.
Незважаючи на тільки що сказане, текстові змінні MATLABа можна записувати і в бінарні файли. Важливо тільки врахувати, що кожен символ вимагає двох байт, тому потрібно використовувати прапор 'int16'.
Ось приклад такої роботи:
В результаті буде створений файл strTest.gqw, що містить в бінарному форматі вміст двох строкових змінних. Їх можна прочитати за допомогою функції fread:
Ніяких спеціальних функцій для запису і читання в файли структур і масивів осередків MATLABа не існує. Тому їх потрібно записувати поелементно з подальшим поелементний читанням і відновленням їх внутрішнього устрою.