Операции с двоичными файлами
Двоичными,
или
бинарными,
называют файлы, данные которых представляют собой машинные коды. Основные операции с такими кодами перечислены ниже.
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 =
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 |
|
49