Урок №19.

Работа с файлами

Файлы — это довольно распространенные объекты системы MATLAB. О некоторых типах файлов уже говорилось в предшествующих главах. В этом уроке рассматриваются свойства файлов, которые не зависят от их типа и относятся к любым файлам.

Открытие и закрытие файлов

Файл обычно является некоторой совокупностью данных, объединенных одним именем. Тип файла, как правило, определяется его расширением. Мы рассматриваем файл как некое целое, хотя физически на диске он может быть представлен несколькими областями — говорят, что в этом случае файл фрагментирован.

Перед использованием любого файла он должен быть открыт, а по окончании использования — закрыт. Много файлов может быть открыто и доступно для чтения одновременно. Рассмотрим команды открытия и закрытия файлов.

Если файлы с расширением существуют в пути MATLAB, то открывается тот файл, который возвращается командой which имя, если нет — то файл из файловой системы. Если файл не имеет расширение имени, то он открывается той программой, формат файлов которой был бы обнаружен функцией игпсИГимя файла') По умолчанию для всех файлов с окончаниями, отличными от вышеперечисленных, вызывается openother. Open вызывает функции орепххх, где ххх — расширение файла. Исключение — переменные рабочей области, для которых вызывается openvar, и рисунки, для работы с которыми вызывается openim. Создавая т-файлы с именем орепххх, пользователи могут изменять обработку файлов и добавлять новые расширения в список. Закрывать файлы, открытые при помощи open, нужно из редакторов, вызываемых ореnххх.

Пример:

[filename, pathname] = uigetfile('*.m;*.fig;*.mat:*.mdl'. 'All MATLAB Files (*.m, *.fig, *.mat. *.mdl)': ...

Пример:

uiopen figure.

Функция ui import запускает Мастер импорта (Import Wizard), импортирующий из файла в текущей папке или буфера обмена Windows. Она соответствует выбору Import Data из меню File или выбору Paste Special из меню Edit MATLAB.

Примеры:

saveas(gcf. 'output', 'fig') saveasCgcf, 'output', 'bmp')

Команда или функция delete удаляет файл или объект графики.

Для записи файлов на диск служит команда save, используемая в довольно очевидных формах:

save

save filename save filename varl var2 ... save ... option save( ' filename' , ...)

Соответственно для считывания файлов с диска служит команда load:

load

load filename load filename X Y Z

load filename -ascii load filename -mat

S

В этих командах имя файла указывается по правилам, принятым в операционных системах класса MS-DOS. Эти команды обычно дублируются кнопками панелей инструментов и браузером файлов.

Операции с двоичными файлами

Двоичными, или бинарными, называют файлы, данные которых представляют собой машинные коды. Основные операции с такими кодами перечислены ниже.

Если открываемый для чтения файл не найден в текущем каталоге, то функция fopen осуществляет поиск файла по пути, указанном в MATLAB.

Параметр permission может принимать одно из следующих основных значений (другие см. в справочной системе):

  1. 'r' — открытие файла для чтения (по умолчанию);

  2. ' r+' — открытие файла для чтения и записи;

  3. 'w' — удаление содержимого существующего файла или создание нового и открытие его для записи;

  4. ' а' — создание и открытие нового файла или открытие существующего для записи с добавлением в конец файла.

Добавление к этой строке ' b' (подразумевается по умолчанию) предписывает системе открыть файл в двоичном режиме.

Добавление же вместо b к этой строке ' t', например ' rt', в операционных системах, которые имеют различие между текстовыми и двоичными файлами, предписывает системе открыть файл в текстовом режиме. Например, во всех версиях MATLAB для Windows/MS-DOS и VMS нельзя открыть текстовый файл без параметра ' rt'. При вводе файлов с использованием fopen в текстовом режиме удаляются все символы «возврат каретки» перед символом новой строки.

Определенные вызовы функций fread или fwrite могут отменить числовой формат, заданный при вызове функции fopen.

Команда fclose закрывает файл. Она имеет следующие варианты.

Пример открытия и закрытия файла:

» fid=fopen('c:\ex'.'а+') fid = 4

 » fclose(4)

ans =

0

Используются следующие параметры size:

Заполнение происходит по столбцам. Если элементов в файле мало, то матрица дополняется нулями. Если считывание достигает конца файла, не заполнив матрицу необходимого размера, то матрица дополняется нулями. Если происходит ошибка, чтение останавливается на последнем считанном значении. Параметр precision — строка, определяющая числовую точность считывания значений, она контролирует число считанных бит для каждого значения и интерпретирует эти биты как целое число, число с плавающей запятой или как символ

Примеры:

» fid = fopen('c:\prim','а+') 

fid =

» A=magic(7)

А =

30

39

48

1

10

19

28

38

47

7

9

18

27

29

46

6

8

17

26

35

37

5

14

16

25

34

36

45

13

15

24

33

42

44

4

21

23

32

41

43

3

12

22

31

40

49

2

11

20

» count = fwrite(j.A) 

count =

49

» status=fclose(3) 

status =

0

» fid 

 fopen('c:\prim'.'r') 

fid =

3

» [B,count] = fread(3.[7.7]) 

В=

30

39

48

1

10

19

28

38

47

7

9

18

27

29

46

6

8

17

26

35

37

5

14

16

25

34

36

45

13

15

24

33

42

44

4

21

23

32

41

43

3

12

22

31

40

49

2

11

20

count = 

49

Операции над форматированными файлами

Файлы, содержащие форматированные данные, называют форматированными файлами. Ниже представлены функции, которые служат для работы с такими файлами.

Если опустить идентификатор fid в списке аргументов функции fprintf, то вывод будет осуществляться на экран, так же как при использовании стандартного вывода (fid=l).

Таблица 19.1. Специальные символы в строках формата

Символ

Описание

\n

Новая строка

\t

Горизонтальная табуляция

\b

Возврат на один символ

\r

Возврат каретки

\f

Новая страница

\\

Обратный слеш

\" или "

Одиночная кавычка

%%

Процент

Функция fprintf ведет себя, как аналогичная функция fprintf О языка ANSI С и с некоторыми исключениями и расширениями. В табл. 19.1 описаны специальные символы, встречающиеся в строке format. Для вывода числовых или символьных данных в строке формата необходимо использовать спецификаторы, перечисленные в табл. 19.2.

Таблица 19.2. Спецификаторы формата вывода данных

Спецификатор

Описание

 %d Десятичная система обозначений (со знаком)
Одиночный символ


Экспоненциальное представление чисел с использованием символа «е» в нижнем регистре, например 3.1415е + 00

Экспоненциальное представление чисел с использованием символа «Е» в верхнем регистре, например 3.1415Е + 00

%f

Система обозначений с фиксированной точкой

%g

Наиболее компактный вариант из %е и %f. Незначащие нули не выводятся

%G

То же самое, что и %д, но используется верхний регистр для символа «Е»


Восьмеричная система обозначений (без знака)

%s

Строка символов

%u

Десятичная система обозначений (без знака)

%x


Шестнадцатеричная система обозначений с использованием символов нижнего регистра («a»...«f»)

%X

Шестнадцатеричная система обозначений с использованием верхнего регистра символов («A»...«F»)

Между знаком процента и буквой в спецификатор могут быть вставлены дополнительные символы. Их значение поясняет табл. 19.3.

Таблица 19.3. Параметры спецификаторов формата

Символ

Описание

Пример

Знак «минус» (-)

Выравнивание преобразованных аргументов по левому краю

%-5.2d

Знак «плюс» (+)

Всегда печатать знак числа (+ или -)

%+5.2d

Ноль (0)

Заполнение нулями вместо пробелов

%05.2d

Цифры

Определяет минимальное число знаков, которые будут напечатаны

%6f

Цифры (после точки)

Число после точки определяет количество символов, печатаемых справа от десятичной точки

%6.2f

Строка format состоит из обычных символов и (или) спецификаторов. Спецификаторы указывают тип считываемых данных и включают символ %, опцию ширины поля и символы формата. Возможные символы формата перечислены в табл. 19.4.

Таблица 19.4. Символы формата, используемые функцией fscanf

Символ

Описание

%c

Последовательность символов; параметр ширины поля определяет количество считываемых символов

%d

Десятичное число

%e, %f, %g

Число с плавающей точкой

%i

Целое число со знаком

%o

Восьмеричное число со знаком

%s

Последовательность непробельных символов

%u

Десятичное целое число со знаком

%x

Шестнадцатеричное целое число со знаком

[...]

Последовательность символов

Между символом % и символом формата допустимо вставлять следующие символы:

Примеры:

» х = 0:pi/10:pi:y-[x:sin(x)];

» fid = fopent 'c:\sin.txt'. V);

» fprintf(fid.'X5.3f *10.6f\n'.y):fclose(fid);

0.000 0.000000

0.314 0.309017

0.628 0.587785

0.942 0.809017

1.257 0.951057

1.571 1.000000

1.885 0.951057

2.199 0.809017

2.513 0.587785

2.827 0.309017

3.142 0.000000

» fid = fopen('c:\sin.txt'.'r');

» q=fscanf(fid.'*g'.[2.10]):

» q'

ans =

0 0

0.3140 0.3090

0.6280 0.5878

0.9420 0.8090

1.2570 0.9511

1.5710 1.0000

1.8850 0.9511

2.1990 0.8090

2.5130 0.5878

2.8270 0.3090

 » fgetl(fid) 

ans =

3.142 0.000000 

» fgets(fid) 

ans =

-1

» fclose(fid) 

ans=

0

Позиционирование файла

При считывании и записи файлов они условно представляются в виде линейно расположенных данных, наподобие записи на непрерывной магнитной ленте. Место, с которого идет считывание в данный момент (или позиция, начиная с которой идет запись), определяется специальным указателем. Файлы последовательного доступа просматриваются строго от начала до конца, а в файлах произвольного доступа указатель может быть размещен в любом месте, начиная с которого ведется запись или считывание данных файла.

Таким образом, указатель обеспечивает позиционирование файлов. Имеется ряд функций позиционирования:

Если последняя операция ввода-вывода, выполненная для определенного значением fid файла, была успешной, значение message — это пустая строка, a errnum принимает значение 0.

Значение errnum, отличное от нуля, говорит о том, что при последней операции ввода-вывода произошла ошибка. Параметр message содержит строку, содержащую информацию о характере возникшей ошибки.

Пример:

» fid=fopen('с:\examplel'.'а+') 

fid =

3

» t= fread(3,[4.5]) 

t =

Empty matrix: 4-by-0 

» ferror(3) 

ans = 

Is the file open for reading? . . .

Аргументы:

Примеры:

» f id-fopen('с:\example'.'a+') 

fid =

3

» count = fwrite(3,magic(6)) 

count = 36

 » ftelK3) 

ans =

36

» frewind(3):ftell(3) 

ans =

0

» fseek(3.12.0);ftell(3)

ans=

12

» feof(3) 

ans =

0

» fclose(3) 

ans =

0

Примеры:

» sprintfC'*0.5g'.(l+sqrt(7))/4)

ans =

0.91144

» sprintfC'%s','привет')

ans =

привет

Функция sscanf аналогична функции fscanf за исключением того, что она считывает данные из символьной переменной системы MATLAB, а не из файла.

Строка format состоит из обычных символов и спецификаторов. Спецификаторы указывают тип данных и включают в себя символ %, опцию ширины поля и символы формата. Пояснения можно найти в описании функции fscanf.

Пример:

» s = '4.83 3.16 22 45';

» [A.n,err,next] = sscanf(s. '%f')

А =

4.8300 - 3.1600

22.0000

45.0000 

n =

еrr=

next = 

16

Специализированные файлы

Приведенные ниже функции относятся к некоторым специализированным файлам:

Аргументы функции dlmread следующие:

  1. delimiter — символ, отделяющий отдельные матричные элементы в электронной таблице формата ASCII;

  2. (,) — разделитель по умолчанию;

  3.  r, с — ячейка электронной таблицы, из которой берутся матричные элементы, соответствующие элементам в верхнем левом углу таблицы;

  4. range — вектор, определяющий диапазон ячеек электронной таблицы.

Команда dlmwrite преобразует матрицу MATLAB в файл с ASCII-разделителями, читаемый программами электронных таблиц:

В табл. 19.5 показаны возможные значения для аргумента fmt. 

Таблица 19.5. Поддерживаемые графические форматы и их обозначения

Формат Тип файла
'bmp' Windows Bitmap (BMP) 
'hdf ' Hierarchical Data Format (HDF)
'jpg' или 'jpeg'  Joint Photographic Experts Group (JPEG)
'pcx'  Windows Paintbrush (PCX) 
'tif 'или 'tiff ' Tagged Image File Format (TIFF)
'xwd' X Windows Dump (XWD)

Если filename — TIFF- или HDF-файл, содержащий более одного изображения, то 1 nf о представляет собой массив структур с отдельным элементом (т. е. с индивидуальной структурой) для каждого изображения в файле. Например, info(3) будет в таком случае содержать информацию о третьем изображении в файле. Множество полей в info зависит от конкретного файла и его формата. Однако первые девять полей всегда одинаковы. В табл. 19.6 перечислены эти поля и описаны их значения.

Таблица 19.6. Поля информационной структуры и их значения

Поле Значение
Filename Строка, содержащая имя файла; если файл находится не в текущей директории, строка содержит полный путь к файлу
FileModDate Строка, содержащая дату последнего изменения файла
FileSize  Целое число, указывающее размер файла в байтах 
Format Строка, содержащая формат файла, заданный параметром fmt; для JPEG- и TIFF-файлов возвращается значение, состоящее из трех символов 
FormatVersion Строка или число, описывающее версию формата 
Width Целое число, указывающее ширину изображения в пикселях 
Height Целое число, указывающее высоту изображения в пикселях 
BitDepth Целое число, указывающее число битов на пиксель 
ColorType Строка, описывающая тип изображения: 'truecolor' для RGB изображения, 'grayscale' для полутонового изображения или 'indexed' для изображения с индексированными цветами

» info = irrifinfo('С:\выставка\Интернет.bmр') 

info =

Filename: 'С:\выставка\Интернет.bmр'

FileModDate: '04-Jan-1999 22:35:56'

FileSize: 481078

Format: 'bmp'

FormatVersion: 'Version 3 (Microsoft Windows 3.x)'

или truecolor (RGB) изображение класса uint8, команда imwrite записывает фактические значения массива в файл. Если А имеет класс double, команда imwrite переопределяет значения в массиве перед записью, используя преобразование uint8(round(255*A)). Эта операция преобразует числа с плавающей запятой в диапазоне [0, 1] к 8-битовым целым числам в диапазоне [0, 255]. Допустимые значения параметра ftnt аналогичны тем, что используются в команде imfinfo;

В табл. 19.7 представлены форматы изображений, доступных для чтения функцией imread. Списки параметров и их возможных значений для функции imwrite содержатся в табл. 19.8.

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

Таблица 19.7. Форматы файлов и их краткое описание

Формат Варианты
BMP 1-битовые, 4-битовые, 8-битовые и 24-битовые несжатые изображения; 4-битовые и 8-битовые изображения со сжатием RLE 
HDF 8-разрядные растровые изображения, содержащие или не содержащие цветовую палитру; 24-разрядные растровые изображения 
JPEG Любые JPEG-изображения; JPEG-изображения с некоторыми обычно используемыми расширениями 
PCX 1-битовые, 8-битовые и 24-битовые изображения 
TIFF Любые TIFF-изображения, включая!-битовые, 8-битовые и 24-битовые несжатые изображения; 1-битовые, 8-битовые и 24-битовые изображения с packbit-сжатием; 1-битовые изображения со сжатием CCITT 
XWD 1-битовые и 8-битовые Zpixmaps; XYBitmaps; 1-битовые XYPixmaps

Таблица 19.8. Параметры, используемые при записи графических файлов

Параметр Значение Значение по умолчанию
Параметры для HDF-файлов
'Compression'  Одно из следующих значений: 'none', Vie', 'jpeg' 'rle'
'Quality' Число между 0 и 100; параметр поддерживается для 'Compression'='jpeg'; чем больше число, тем выше качество файла (меньше искажений файла при сжатии) и тем больше его размер 75
'WriteMode' Одно из следующих значений: 'overwrite', 'append' 'overwrite'
Параметры для JPEG-файлов
'Quality'  Число между 0 и 100; чем больше число, тем выше качество файла (меньше искажений при сжатии файла) и тем больше его размер. 75
Параметры для TIFF-файлов
'Compression'  Одно из следующих значений: 'none', 'packbits', 'ccitt'; значение 'ccitt' допустимо только для двоичных (двухцветных) изображений 'ccitt' для двоичных изображений; 'packbits' для всех остальных 
'Description'  Любая строка; значение поля ImageDescription возвращается командой imfinfo Пустая строка
 'Resolution'  Скалярное значение для разрешения в направлениях х и у
72

Что нового мы узнали?

В этом уроке мы научились: