Низкоуровневые функции ввода-вывода файлов позволяют осуществлять самый непосредственный контроль над чтением или записью данных в файл. Однако эти функции требуют указания более подробной информации о файле, чем упрощенные высокоуровневые функции. Полный список функций высокого уровня и поддерживаемых ими форматов файлов см. в разделе Поддерживаемые форматы файлов для импорта и экспорта.
Если высокоуровневые функции не могут импортировать данные, используйте одно из следующих действий.
fscanf, которая считывает форматированные данные в текстовом или ASCII-файле; то есть файл, который можно просмотреть в текстовом редакторе. Дополнительные сведения см. в разделе Чтение данных в форматированном шаблоне.
fgetl и fgets, которые считывают одну строку файла за раз, где символ новой строки разделяет каждую строку. Дополнительные сведения см. в разделе Построчное чтение данных.
fread, которая считывает поток данных на уровне байта или бита. Дополнительные сведения см. в разделе Чтение двоичных данных в файле.
Примечание
Низкоуровневые файловые функции ввода-вывода основаны на функциях библиотеки ANSI ® Standard 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 переместите индикатор положения файла.
Используйте 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');
Различные операционные системы по-разному хранят информацию на уровне байтов или битов:
Системы Big-endian хранят байты, начинающиеся с наибольшего адреса в памяти (то есть начинаются с большого конца).
Системы Little-endian хранят байты, начиная с наименьшего адреса (маленький конец).
Системы Windows ® используют порядок байтов little-endian, а системы UNIX ® - big-endian.
Чтобы прочитать файл, созданный в системе противоположного уровня, укажите порядок байтов, используемый для создания файла. Можно указать порядок в вызове для открытия файла или в вызове для чтения файла.
Например, рассмотрим файл со значениями двойной точности с именем little.bin, созданный на малозначительной системе. Чтобы прочитать этот файл в системе big-endian, используйте одну (или обе) из следующих команд:
Откройте файл с помощью
fid = fopen('little.bin', 'r', 'l')Прочитать файл с помощью
mydata = fread(fid, 'double', 'l')
где 'l' обозначает порядок little-endian.
Если вы не уверены, какой порядок байтов используется в вашей системе, вызовите computer функция:
[cinfo, maxsize, ordering] = computer
ordering является 'L' для систем little-endian или 'B' для биг-эндиевых систем.