Низкоуровневые функции ввода-вывода файлов позволяют наиболее непосредственно управлять чтением или записью данных в файл. Однако эти функции требуют, чтобы вы указывали более подробную информацию о файле, чем более простые в использовании функции высокого уровня. Полный список функций высокого уровня и поддерживаемых ими форматов файлов см. в Поддерживаемые Форматы файлов для Импорта и Экспорта.
Если функции высокого уровня не могут импортировать ваши данные, используйте одно из следующего:
fscanf
, который считывает форматированные данные в текстовом или ASCII-файле; то есть файл, который можно просмотреть в текстовом редакторе. Для получения дополнительной информации см. раздел Чтение данных в форматированный шаблон.
fgetl
и fgets
, который считывает по одной линии файла за раз, где символ новой строки разделяет каждую строку. Для получения дополнительной информации смотрите Построчное чтение данных.
fread
, который считывает поток данных на байтовом или битовом уровне. Для получения дополнительной информации смотрите Чтение двоичных данных в файле.
Примечание
Низкоуровневые функции ввода-вывода файлов основаны на функциях в ANSI® Стандартная библиотека C. Однако MATLAB® включает векторизованные версии функций для чтения и записи данных в массив с минимальными циклами управления.
Как и в случае с любыми низкоуровневыми функциями ввода-вывода, перед импортом откройте файл с fopen
, и получить идентификатор файла. Когда вы закончите обработку файла, закройте его с fclose
(
.fileID
)
По умолчанию, fread
считывает файл по 1 байту за раз и интерпретирует каждый байт как 8-битное беззнаковое целое число (uint8
). fread
создает вектор-столбец с одним элементом для каждого байта в файле. Значения в векторе-столбце имеют класс double
.
Например, рассмотрите файл nine.bin
, созданный следующим образом:
fid = fopen('nine.bin','w'); fwrite(fid, [1:9]); fclose(fid);
Чтобы считать все данные в файле в вектор-столбец классов 9 на 1 double
:
fid = fopen('nine.bin'); col9 = fread(fid); fclose(fid);
По умолчанию, fread
считывает все значения в файле в вектор-столбец. Однако можно задать количество считываемых значений или описать двумерную выходную матрицу.
Для примера читать nine.bin
, описанная в предыдущем примере:
fid = fopen('nine.bin'); % Read only the first six values col6 = fread(fid, 6); % Return to the beginning of the file frewind(fid); % Read first four values into a 2-by-2 matrix frewind(fid); two_dim4 = fread(fid, [2, 2]); % Read into a matrix with 3 rows and % unspecified number of columns frewind(fid); two_dim9 = fread(fid, [3, inf]); % Close the file fclose(fid);
Если значения в вашем файле не являются 8-битными беззнаковыми целыми числами, задайте размер значений.
Например, рассмотрите файл fpoint.bin
, созданный со значениями двойной точности следующим образом:
myvals = [pi, 42, 1/3]; fid = fopen('fpoint.bin','w'); fwrite(fid, myvals, 'double'); fclose(fid);
Чтобы считать файл:
fid = fopen('fpoint.bin'); % read, and transpose so samevals = myvals samevals = fread(fid, 'double')'; fclose(fid);
Полный список описаний точности см. в fread
страница с описанием функции.
По умолчанию, fread
создает массив классов double
. Для хранения значений двойной точности в массиве требуется больше памяти, чем для хранения символов, целых чисел или значений с одной точностью.
Чтобы уменьшить объем памяти, необходимой для хранения данных, укажите класс массива одним из следующих методов:
Сопоставьте класс входных значений со звездочкой ('*'
). Для примера, чтобы считать значения с одной точностью в массив классов single
, используйте команду:
mydata = fread(fid,'*single')
Сопоставьте входные значения с новым классом с '=>'
символ. Для примера читать uint8
значения в uint16
массив, используйте команду:
mydata = fread(fid,'uint8=>uint16')
Полный список описаний точности см. в fread
страница с описанием функции.
Низкоуровневые функции MATLAB включают несколько опций для чтения фрагментов двоичных данных в файл:
Считывайте заданное количество значений за раз, как описано в разделе Изменение размерностей массива. Рассмотрите объединение этого метода с Проверкой на конец файла.
Перейдите в определенное место в файле, чтобы начать чтение. Для получения дополнительной информации см. раздел Перемещение внутри файла.
Пропустите определенное количество байтов или бит после чтения каждого элемента. Для получения примера смотрите Запись и чтение комплексных чисел.
Когда вы открываете файл, MATLAB создает указатель, чтобы указать текущее положение в файле.
Примечание
Открытие пустого файла не перемещает индикатор положения файла в конец файла. Считывайте операции и fseek
и frewind
functions, перемещает индикатор положения файла.
Используйте feof
функция, чтобы проверить, достигли ли вы конца файла. feof
возвращает значение 1
когда указатель на файл находится в конце файла. В противном случае возвращается 0
.
Например, чтение большого файла по частям:
filename = 'largedata.dat'; % hypothetical file segsize = 10000; fid = fopen(filename); while ~feof(fid) currData = fread(fid, segsize); if ~isempty(currData) disp('Current Data:'); disp(currData); end end fclose(fid);
Чтобы считать или записать выбранные фрагменты данных, переместите индикатор положения файла в любое место в файле. Для примера вызовите fseek
с синтаксисом
fseek(fid,offset,origin);
где:
Кроме того, чтобы легко переместиться в начало файла:
frewind(fid);
Использовать ftell
для поиска текущей позиции в заданном файле. ftell
возвращает количество байтов от начала файла.
Например, создайте файл five.bin
:
A = 1:5; fid = fopen('five.bin','w'); fwrite(fid, A,'short'); fclose(fid);
Потому что вызов на fwrite
задает short
формат, каждый элемент A
использует два байта памяти в five.bin
.
Откройте five.bin
для чтения:
fid = fopen('five.bin','r');
Переместите индикатор положения файла вперед на 6 байт от начала файла:
status = fseek(fid,6,'bof');
Прочитайте следующий элемент:
four = fread(fid,1,'short');
Акт чтения совершенствует индикатор положения файла. Чтобы определить текущее положение файла, вызовите ftell:
position = ftell(fid) position = 8
Чтобы переместить индикатор положения файла назад на 4 байта, вызовите fseek
снова:
status = fseek(fid,-4,'cof');
Считайте следующее значение:
three = fread(fid,1,'short');
Различные операционные системы хранят информацию по-разному в байтовом или битовом уровне:
Большие-эндовые системы хранят байты начиная с самого большого адреса в памяти (то есть начинают с большого конца).
Маленькие-эндовые системы хранят байты, начиная с наименьшего адреса (маленький конец).
Windows® системы используют малоэндовое упорядоченное расположение байтов, и UNIX® системы используют big-endian упорядоченное расположение байтов.
Чтобы считать файл, созданный в противоположной системе, задайте упорядоченное расположение байтов, используемый для создания файла. Вы можете задать упорядоченное расположение в вызове, чтобы открыть файл, или в вызове, чтобы считать файл.
Например, рассмотрите файл с именованными значениями двойной точности little.bin
, созданный по малоэндовой системе. Чтобы считать этот файл в большой эндовой системе, используйте одну (или обе) из следующих команд:
Откройте файл с
fid = fopen('little.bin', 'r', 'l')
Чтение файла с
mydata = fread(fid, 'double', 'l')
где 'l'
указывает на маленькое-эндовое упорядоченное расположение.
Если вы не уверены, какой заказ байтов использует ваша система, вызовите computer
функция:
[cinfo, maxsize, ordering] = computer
ordering
является 'L'
для маленьких эндовых систем или 'B'
для систем с большим эндом.