Урок №19.
Работа с файлами
Открытие и закрытие файлов
Операции с двоичными файлами
Операции над форматированными файлами
Позиционирование файла
Специализированные файлы
Файлы — это довольно распространенные объекты системы MATLAB. О некоторых типах файлов уже говорилось в предшествующих главах. В этом уроке рассматриваются свойства файлов, которые не зависят от их типа и относятся к любым файлам.
Открытие и закрытие файлов
Файл обычно является некоторой совокупностью данных, объединенных одним именем. Тип файла, как правило, определяется его расширением. Мы рассматриваем файл как некое целое, хотя физически на диске он может быть представлен несколькими областями — говорят, что в этом случае файл фрагментирован.
Перед использованием любого файла он должен быть открыт, а по окончании использования — закрыт. Много файлов может быть открыто и доступно для чтения одновременно. Рассмотрим команды открытия и закрытия файлов.
Команда open имя, где имя должно содержать массив символов или символьную переменную, открывает файлы в зависимости от анализа параметра имя и расширения в имени имя:
переменная — открывает массив, названный по имени, в редакторе массивов (Array Editor);
.mat — открывает файл, сохраняет переменные в структуре в рабочей области;
.fig — открывает его в редакторе дескрипторонй графики Property Editor;
.m — открывает m-файл в редакторе-отладчике;
.mdl - открывает модель в Simulink;
.р — открывает, если он есть, m-файл с тем же именем;
. html — открывает HTML документ в браузере помощи.
Если файлы с расширением существуют в пути MATLAB, то открывается тот файл, который возвращается командой which имя, если нет — то файл из файловой системы. Если файл не имеет расширение имени, то он открывается той программой, формат файлов которой был бы обнаружен функцией игпсИГимя файла') По умолчанию для всех файлов с окончаниями, отличными от вышеперечисленных, вызывается openother. Open вызывает функции орепххх, где ххх — расширение файла. Исключение — переменные рабочей области, для которых вызывается openvar, и рисунки, для работы с которыми вызывается openim. Создавая т-файлы с именем орепххх, пользователи могут изменять обработку файлов и добавлять новые расширения в список. Закрывать файлы, открытые при помощи open, нужно из редакторов, вызываемых ореnххх.
[FILENAME, PATHNAME] = uigetfile(FILTERSPEC. Title). Открывает диалог с именем Title и фильтром FILTERSPEC (например, массивом ячеек, содержащим расширения файлов) и возвращает файл, выбранный пользователем, и путь к нему. Возвращает FILENAME=0, если файл не существует или если пользователь нажал на Cancel. [FILENAME, PATHNAME] = uigetfile (FILTERSPEC, Title. X. Y) размещает окно диалога в точке X, Y (координаты в пикселях).
Пример:
[filename, pathname] = uigetfile('*.m;*.fig;*.mat:*.mdl'. 'All MATLAB Files (*.m, *.fig, *.mat. *.mdl)': ...
[FILENAME, PATHNAME] = uiputfile(FILTERSPEC. TITLE) сохраняет файл в диалоге, управляемом пользователем. Параметры аналогичны таковым в функции uigetfile.
Команда ui open открывает диалог, и если пользователь выбрал файл с известным расширением, вызывает его, используя open, или если имя файла имеет неизвестное расширение, то вызывается uigetfile. Входными аргументами uiopen могут быть mat lab, load, figure, simulink, editor. Без входных аргументов или с входным аргументом matlab в окне диалога предлагается выбрать *.m, *.fig, *.mat, *.mdl (если Simulink установлен) , * . cdr (если state flow установлен) , *.rtw, *.tmf, *.tlc, *.c, *.h, *.ads, *.adb (если установлен Real-Time Workshop). С аргументом load — *.mat. С аргументом figure предлагаются *.fig; simul ink — *.mdl, editor - *.m, *.mdt *.cdr, *.rtw, *.tmf, *.tlc, *.c, *.h, *.ads, *.adb.
Пример:
uiopen figure.
Команда uiload открывает файл в диалоге, управляемом пользователем, с использованием команды load.
Функция ui import запускает Мастер импорта (Import Wizard), импортирующий из файла в текущей папке или буфера обмена Windows. Она соответствует выбору Import Data из меню File или выбору Paste Special из меню Edit MATLAB.
ui import (FILENAME) — запускает Мастер Импорта, открывая файл FILENAME. Мастер импорта показывает данные для предварительного просмотра. В окне предварительного просмотра появляются данные и их представление в виде переменных MATLAB. Собственно данные, текст и заголовки представляются разными переменными MATLAB. Для данных ASCII вы должны удостовериться, что Мастер импорта распознал разделители столбцов. Самостоятельно он может распознать только символ табуляции, пробел, запятую или точку с запятой. Нужно щелкнуть мышью на кнопке Next и в следующем окне либо подтвердить выбор разделителя, сделанный Мастером, либо выбрать Other и ввести любой разделитель.
ui import (' -f i le') — вначале выводит диалог выбора файла.
ui import ('-pastespecial') — вначале выводит для предварительного просмотра содержимое буфера обмена Windows.
S = ui import (...) хранит результирующие переменные как поля структуры S.
Команда uisave — управляемое пользователем сохранение (команда save описана в уроке 2) с Windows диалогом.
Функция saveas — сохраняет рисунок или модель Simulink в желаемом формате на носителе информации или на устройстве, разрешенном print.
Функция saveas (H, 'FILENAME' ) — сохраняет данные в соответствии с командой дескрипторной графики Н в файле FILENAME. Формат файла определяется расширением имени FILENAME.
Функция saveas (H. 'FILENAME' . 'FORMAT' ) — выполняет то же, но с параметром FORMAT (формат задается тем же способом, что и расширение имени файла и может от него отличаться). FORMAT имеет приоритет перед расширением имени файла. Параметры функции:
'fig' — сохранить рисунок (график) в двоичном fig-файле;
' m ' или ' mf i д ' — сохранить рисунок в двоичном fig-файле и создать m-файл для его загрузки;
' mmat ' - сохранить рисунок в m-файле как последовательность команд создания рисунка. Может не поддерживать новейшие графические функции.
Примеры:
saveas(gcf. 'output', 'fig') saveas(gcf, 'output', 'bmp')
Команда или функция delete удаляет файл или объект графики.
delete имя файла удаляет файл текущей папки. Может быть использована *. Предпочтительно использование с записью в форме функции delete('mw файла'), когда имя файла — строка.
delete(H) удаляет графический объект с дескриптором Н. Если этот объект — окно, то оно предварительно закрывается.
Функция close(H) закрывает только графические окна. Для закрытия файлов необходимо использовать команду f close.
Для записи файлов на диск служит команда 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(filename, permission) — открывает файл с именем filename и параметром, определенным в permission, и возвращает идентификатор fid со значением: 0 — чтение с клавиатуры (permission установлено в 'r'); 1 — вывод на дисплей (permission установлено в 'а'); 2 — вывод сообщения об ошибке (permission установлен в ' а'); -1 — неудача в открытии файла с выводом сообщения message о типе ошибки. Идентификатор fid часто используется в качестве аргумента другими функциями и программами ввода-вывода. Имя файла filename может содержать путь к файлу.
Если открываемый для чтения файл не найден в текущем каталоге, то функция fopen осуществляет поиск файла по пути, указанном в MATLAB.
Параметр permission может принимать одно из следующих основных значений (другие см. в справочной системе):
'r' — открытие файла для чтения (по умолчанию);
' r+' — открытие файла для чтения и записи;
'w' — удаление содержимого существующего файла или создание нового и открытие его для записи;
' а' — создание и открытие нового файла или открытие существующего для записи с добавлением в конец файла.
Добавление к этой строке ' b' (подразумевается по умолчанию) предписывает системе открыть файл в двоичном режиме.
Добавление же вместо b к этой строке ' t', например ' rt', в операционных системах, которые имеют различие между текстовыми и двоичными файлами, предписывает системе открыть файл в текстовом режиме. Например, во всех версиях MATLAB для Windows/MS-DOS и VMS нельзя открыть текстовый файл без параметра ' rt'. При вводе файлов с использованием fopen в текстовом режиме удаляются все символы «возврат каретки» перед символом новой строки.
[fid,message] = fopentfilename.permission,format) — открывает файл, как описано выше, возвращая идентификатор файла и сообщение. Кроме того, значение параметра format позволяет точно определить числовой формат. Возможно 8 форматов, описание которых можно найти в справочной системе. В частности, строка format может иметь значения 'native' (формат компьютера, на котором установлена система), 'vax', 'сгау' (компьютеры VAX и Cray) и т. д.
Определенные вызовы функций fread или fwrite могут отменить числовой формат, заданный при вызове функции fopen.
fids = fopen С all') — возвращает вектор-строку, содержащую идентификаторы всех открытых файлов, не включая стандартные потоки О, 1 и 2. Число элементов вектора равно числу открытых пользователем файлов;
[filename,permission,format] -fopen(fid) — возвращает полное имя файла, строку .permission и строку format. При использовании недопустимых значений fid возвращаются пустые строки для всех выходных аргументов.
Команда fclose закрывает файл. Она имеет следующие варианты.
status = fclose(fid) — закрывает файл, если он открыт. Возвращает статус файла status, равный 0, если закрытие завершилось успешно, и -1 в противном случае. Аргумент fid — это идентификатор, связанный с открытым файлом (см. функцию fopen для более подробного описания);
status = fclose( 'all') закрывает все открытые файлы. Возвращает 0 в случае успешного завершения и -1 — в противном случае.
Пример открытия и закрытия файла:
» fid=fopen('c:\ex'.'а+') fid = 4
» fclose(4)
ans =
0
[A,count] = fread(fid,size,precision) — считывает двоичные данные из заданного файла и помещает их в матрицу А. Выходной аргумент count содержит число удачно считанных элементов. Значение идентификатора fid — это целое число, возвращенное функцией fopen; size — аргумент, определяющий количество считываемых данных. Если аргумент size не определен, функция f read считывает данные до конца файла.
Используются следующие параметры size:
n — чтение n элементов в вектор-столбец;
inf — чтение элементов до конца файла и помещение их в вектор-столбец, содержащий такое же количество элементов, что и в файле;
[m.n] — считывает столько элементов, сколько нужно для заполнения матрицы тхп.
Заполнение происходит по столбцам. Если элементов в файле мало, то матрица дополняется нулями. Если считывание достигает конца файла, не заполнив матрицу необходимого размера, то матрица дополняется нулями. Если происходит ошибка, чтение останавливается на последнем считанном значении. Параметр precision — строка, определяющая числовую точность считывания значений, она контролирует число считанных бит для каждого значения и интерпретирует эти биты как целое число, число с плавающей запятой или как символ
[A.count] = fread(fid,size.precision,skip) — включает произвольный аргумент skip, который определяет число байтов, которые необходимо пропустить после каждого считывания. Это может быть полезно при извлечении данных г несмежных областях из записей фиксированной длины. Если precision имеет битовый формат, такой как 'bitN 1 или 'ubitN', значение skip определяется ~ битах. Обширный список возможных значений параметра precision можн найти в справочной системе MATLAB;
count=fwrite(fid,A,precision) — записывает элементы матрицы А в файл, представляя их с заданной точностью. Данные записываются в файл по столбцам, выходной аргумент count содержит число удачно записанных элементов. Значение идентификатора fid — это целое число, полученное при использовании функции f open. Добавляет символы «возврат каретки» перед началом новой строки;
count=fwrite(fid.A,precision,skip) — делает то же, но включает произвольный аргумент skip, который определяет число байтов, которые надо пропустить перед каждой записью. Это полезно при вставке данных в несмежные области в записях фиксированной длины. Если precision имеет битовый формат, такой как 'bitN' или 'ubitN', значение skip определяется в битах.
Примеры:
» fid = fopen('c:\prim','а+')
fid =
3
» 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
Операции над форматированными файлами
Файлы, содержащие форматированные данные, называют форматированными файлами. Ниже представлены функции, которые служат для работы с такими файлами.
line = fgetl (fid) — возвращает строку из файла с идентификатором fid с удалением символа конца строки. Если функция fgetl обнаруживает конец файла, то она возвращает значение -1 (см. функцию fopen с более подробным описанием fid);
line = f gets (fid) — возвращает строку из файла с идентификатором fid, не удаляя символ конца строки. Если функция fgets обнаруживает конец файла, то она возвращает значение -1;
line = fgets(fid.nchar) — возвращает не больше чем nchar первых символов строки. После признака конца строки или конца файла никакие дополнительные символы не считываются (см. примеры к функции fscanf);
count = fprintf(fid.format,A....) — форматирует данные, содержащиеся в действительной части матрицы А, под контролем строки format и записывает их в файл с идентификатором fid. Функция fprintf возвращает число записанных байтов. Значение идентификатора fid — целое число, возвращаемое функцией fopen.
Если опустить идентификатор fid в списке аргументов функции fprintf, то вывод будет осуществляться на экран, так же как при использовании стандартного вывода (fid=l).
fprintf(format,A....) — запись осуществляется на стандартное устройство — экран (но не в файл). Строка format определяет систему счисления, выравнивание, значащие цифры, ширину поля и другие атрибуты выходного формата. Она может содержать обычные буквы алфавита наряду со спецификаторами, знаками выравнивания и т. д.
Таблица 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 |
А = fscanf(fid,format) — читает все данные из файла с идентификатором, fid, преобразует их согласно значению параметра format и возвращает в виде матрицы А. Значение идентификатора fid — целое число, возвращаемое функцией fopen. Параметр format представляет собой строку, определяющую формат данных, которые необходимо прочитать;
[A,count] = fscanf(fid.format,size) — считывает количество данных, определенное параметром size, преобразует их в соответствии с параметром format и возвращает вместе с количеством успешно считанных элементов count. Параметр size — это произвольный аргумент, определяющий количество считываемых данных. Допустимы следующие значения:
n — чтение п элементов в вектор-столбец;
inf — чтение элементов до конца файла и помещение их в вектор-столбец, содержащий такое же количество элементов, что и в файле;
[m,n] — считывает столько элементов, сколько требуется для заполнения матрицы размера тхп. Заполнение происходит по столбцам. Величина n (но нет!) может принимать значение Inf.
Строка format состоит из обычных символов и (или) спецификаторов. Спецификаторы указывают тип считываемых данных и включают символ %, опцию ширины поля и символы формата. Возможные символы формата перечислены в табл. 19.4.
Таблица 19.4. Символы формата, используемые функцией fscanf
|
|
||
|
%c |
Последовательность символов; параметр ширины поля определяет количество считываемых символов |
|
|
|
||
|
%d |
Десятичное число |
|
|
%e, %f, %g |
Число с плавающей точкой |
|
|
%i |
Целое число со знаком |
|
|
%o |
Восьмеричное число со знаком |
|
|
%s |
Последовательность непробельных символов |
|
|
%u |
Десятичное целое число со знаком |
|
|
%x |
Шестнадцатеричное целое число со знаком |
|
|
[...] |
Последовательность символов |
|
|
|
|
|
Между символом % и символом формата допустимо вставлять следующие символы:
звездочка (*) означает, что соответствующее значение не нужно сохранять в выходной матрице;
строка цифр задает максимальную ширину поля;
буква обозначает размер полученного объекта: h для короткого целого числа (например, %n d), 1 для длинного целого числа (например, %ld) или для числа с двойной точностью с плавающей запятой (например, % lg ).
Примеры:
» х = 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
Позиционирование файла
При считывании и записи файлов они условно представляются в виде линейно расположенных данных, наподобие записи на непрерывной магнитной ленте. Место, с которого идет считывание в данный момент (или позиция, начиная с которой идет запись), определяется специальным указателем. Файлы последовательного доступа просматриваются строго от начала до конца, а в файлах произвольного доступа указатель может быть размещен в любом месте, начиная с которого ведется запись или считывание данных файла.
Таким образом, указатель обеспечивает позиционирование файлов. Имеется ряд функций позиционирования:
eofstat = feof(fid) — проверяет, достигнут ли конец файла с идентификатором fid. Возвращает 1, если указатель установлен на конец файла, и 0 — в противном случае;
message = ferror(fid) — возвращает сведения об ошибке в виде строки message. Аргумент fid — идентификатор открытого файла (см. функцию fopen с ее подробным описанием);
message = f error (f id,'clear') — очищает индикатор ошибки для заданного файла;
[message,errnum] = ferror(.) — возвращает номер ошибки errnum последней операции ввода-вывода для заданного файла.
Если последняя операция ввода-вывода, выполненная для определенного значением 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? . . .
frewind(fid) — устанавливает указатель позиции в начало файла с идентификатором fid;
status - fseekCfid,offset,origin) — устанавливает указатель в файле с идентификатором fid в заданную позицию — на байт, указанный параметром offset относительно origin.
Аргументы:
fid — идентификатор файла, возвращенный функцией fopen;
offset — значение, которое интерпретируется следующим образом:
offset>0 — изменяет позицию указателя на offset байт в направлении к концу файла;
offset=0 — не меняет позицию указателя;
offset<0 — изменяет позицию указателя на offset байт в направлении к началу файла;
origin — аргумент, принимающий следующие значения:
'bof или -1 — начало файла;
'cof' или 0 — текущая позиция указателя в файле;
' eof' или 1 — конец файла;
status — выходной аргумент. Принимает значение 0, если операция fseek произошла успешно, и -1 в противном случае. Если произошла ошибка, используйте функцию ferror для получения более подробной информации;
position=ftel I (fid) — возвращает позицию указателя для файла с идентификатором fid, полученным с помощью функции fopen. Выходной аргумент position — неотрицательное целое число, определяющее позицию указателя в байтах относительно начала файла. Если запрос был неудачным, position принимает значение -1. Используйте функцию ferror для отображения характера ошибки.
Примеры:
» 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
s=sprintf(format,A,...) — форматирует данные в матрице А в формате, заданном параметром format, и создает из них строковую переменную s;
[s.errrmsg] = sprintfCformat,A....) — аналогична ранее описанной функции, но дополнительно возвращает строку ошибки errmsg, если ошибка имела место, или пустую строку в противном случае. Строка format определяет систему счисления, выравнивание, значащие цифры, ширину поля и другие атрибуты выходного формата. Она может содержать обычные символы наряду со спецификаторами, знаками выравнивания и т. д. Функция fprintf ведет себя, как и аналогичная функция fprintf 0 языка ANSI С, с некоторыми исключениями и расширениями.
Примеры:
» sprintf('*0.5g'.(l+sqrt(7))/4)
ans =
0.91144
» sprintfC '%s', 'привет')
ans =
привет
Функция sscanf аналогична функции fscanf за исключением того, что она считывает данные из символьной переменной системы MATLAB, а не из файла.
А = sscanf (s,format) — считывает данные из символьной переменной s, преобразует их согласно значению format и создает на основе этих данных матрицу А. Параметр format определяет формат данных, которые нужно считать;
А = sscanf(s,format,size) — считывает количество данных, определенное параметром size, и преобразует их согласно строке format. Параметр size представляет собой аргумент, определяющий количество данных для чтения. Допустимы следующие значения:
n — чтение п элементов в вектор-столбец;
inf — чтение элементов до конца символьной переменной и помещение их в вектор-столбец, содержащий такое же количество элементов, как и в строковой переменной;
[m.n] — считывает столько элементов, сколько требуется для заполнения матрицы размера тхп. Заполнение происходит по столбцам. Величина п (но нет!) может принимать значение Inf.
[A,count,errmsg,nextindex] = sscanf(...) — считывает данные из символьной переменной s, преобразует их согласно значению format и возвращает в матрицу А. Параметр count — выходной.аргумент, который возвращает число успешно считанных элементов; errmsg — выходной аргумент, который возвращает строку ошибки, если ошибка произошла, и пустую строку в противном случае; nextindex — выходной аргумент, который содержит число, на единицу большее, чем количество символов в s.
Строка 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 =
4
еrr=
next =
16
Специализированные файлы
Приведенные ниже функции относятся к некоторым специализированным файлам:
М = dlmread(filename, delimiter) — считывает данные из файла filename с ASCII-разделителем, используя разделитель delimiter, в массив М. Используйте '\t', i чтобы определить в качестве разделителя символ табуляции;
М = dlmreadCfilename.delimiter,г.с) — считывает данные из файла filename с ASCII-разделителем, используя разделитель delimiter, в массив М, начиная со смещения г (по строкам) и с (по столбцам). Параметры r и с отсчитываются начиная с нуля, так что г=0, с=0 соответствует первому значению в файле;
М = dlmreadCfilename, deli mi ten, r, с, range) — импортирует индексированный или именованный диапазон данных с разделителями в формате ASCII. Для использования диапазона ячеек нужно определить параметр range в виде range = [ВерхняяСтрока. ЛевыйСтолбец. НижняяСтрока, ПравыйСтолбец].
Аргументы функции dlmread следующие:
delimiter — символ, отделяющий отдельные матричные элементы в электронной таблице формата ASCII;
(,) — разделитель по умолчанию;
r, с — ячейка электронной таблицы, из которой берутся матричные элементы, соответствующие элементам в верхнем левом углу таблицы;
range — вектор, определяющий диапазон ячеек электронной таблицы.
Команда dlmwrite преобразует матрицу MATLAB в файл с ASCII-разделителями, читаемый программами электронных таблиц:
dl mwri te (f i 1 ename. A. delimiter) — записывает матрицу А в верхнюю левую ячейку электронной таблицы filename, используя разделитель delimiter для отделения элементов матрицы. Используйте ' U' для создания файла с элементами, разделенными табуляцией. Все элементы со значением 0 опускаются. Например, массив [102] появится в файле в виде ' 1., 2' (если разделителем является запятая):
dlmwrite(filename,A,delimiter, r,с) — записывает матрицу А в файл filename, начиная с ячейки, определенной r и с, используя разделитель delimiter;
info=imfinfo(filename.fmt) — возвращает структуру, поля которой содержат информацию об изображении в графическом файле. Аргумент filename — строка, определяющая имя графического файла, fmt — строка, которая определяет формат файла. Файл должен находиться в текущей директории или в директории, указанной в пути MATLAB. Если imflnfo не может найти файл с именем filename, она ищет файл с именем filename.fmt.
В табл. 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 = imfinfo(filename) — пытается определить формат файла по содержимому. Пример:
» 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;
imwrite(X,map,filename,fmt) — записывает индексированное изображение, находящееся в массиве X, и соответствующую ему цветовую палитру тар в файл filename. Если X содержит изображение класса uint8, команда imwrite записывает фактические значения массива в файл. Если X имеет класс double, команда imwrite переопределяет значения в массиве перед записью, используя преобразование uintS(X-l). Палитра тар должна иметь класс double; функция imwrite переопределяет значения в тар, используя преобразование uint8(round (255*mар));
imwrite (....filename) — записывает изображение в filename в формате, указанном в расширении файла. Расширение может быть одним из допустимых значений параметра fmt;
imwrite (....Parameter, Value....) определяет параметры, которые контролируют различные свойства выходного файла. Параметры используются для HDF, JPEG, и TIFF файлов;
М = wklread(filename) — считывает электронную таблицу Lotusl23 (WK1) в матрицу М;
М = wklread(filename.r.c) — считывает данные, начиная с ячейки, определенной значениями (r,с). Параметры г и с отсчитываются от нуля, так что г=0, с=0 определяют первую ячейку в файле;
М = wklread(filename,r,c,range) — считывает диапазон значений, определенный параметром range, где range может быть представлен в одной из следующих форм:
вектор с четырьмя элементами, определяющий диапазон ячеек в формате [верхняя_строка. левый_столбец, нижняя_строка, правый_столбец];
диапазон ячеек, определенный строкой, например ' А1... С5';
имя диапазона, определенное в виде строки, например 'Sales'.
wklwrite(filename.M) — записывает значения матрицы М в файл filename электронной таблицы Lotus 123 WK1;
wklwrite(filename,M,r,c) — записывает данные, начиная с ячейки, определенной значениями (r,с). Параметры г и с отсчитываются от нуля, так что г=0, с=0 определяют первую ячейку в электронной таблице.
В табл. 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 |
Что нового мы узнали?
В этом уроке мы научились:
Открывать и закрывать файлы.
Выполнять операции с двоичными и форматированными файлами.
Осуществлять позиционирование файла.
Применять специализированные файлы.