fscanf

Чтение данных из текстового файла

Описание

пример

A = fscanf(fileID,formatSpec) считывает данные из открытого текстового файла в вектор-столбец A и интерпретирует значения в файле в соответствии с форматом, заданным formatSpec. fscanf функция повторно применяет формат во всем файле и помещает указатель на файл в маркер конца файла. Если fscanf не может соответствовать formatSpec для данных он считывает только фрагмент, которая совпадает и останавливает обработку.

Текстовый файл обозначается идентификатором файла fileID. Использовать fopen чтобы открыть файл, задайте кодировку символов и получите fileID значение. Когда вы закончите чтение, закройте файл, позвонив fclose(fileID).

пример

A = fscanf(fileID,formatSpec,sizeA) считывает данные файла в массив, A, с размерностями, sizeA, и помещает указатель на файл после последнего считанного значения. fscanf заполняет A в порядке столбца. sizeA должно быть положительным целым числом или иметь форму [m n], где m и n являются положительными целыми числами.

пример

[A,count] = fscanf(___) дополнительно возвращает количество полей, fscanf читает в A. Для числовых данных это количество считанных значений. Можно использовать этот синтаксис с любым из входных параметров предыдущих синтаксисов.

Примеры

свернуть все

Создайте образец текстового файла, который содержит числа с плавающей запятой.

x = 100*rand(8,1);
fileID = fopen('nums1.txt','w');
fprintf(fileID,'%4.4f\n',x);
fclose(fileID);

Просмотрите содержимое файла.

type nums1.txt
81.4724
90.5792
12.6987
91.3376
63.2359
9.7540
27.8498
54.6882

Откройте файл для чтения и получите идентификатор файла, fileID.

fileID = fopen('nums1.txt','r');

Определите формат считываемых данных. Использование '%f' для задания чисел с плавающей запятой.

formatSpec = '%f';

Считайте данные файла, заполняя выходной массив, A, в порядке столбца. fscanf повторно применяет формат, formatSpec, по всему файлу.

A = fscanf(fileID,formatSpec)
A = 8×1

   81.4724
   90.5792
   12.6987
   91.3376
   63.2359
    9.7540
   27.8498
   54.6882

A - вектор-столбец, содержащая данные из файла.

Закройте файл.

fclose(fileID);

Создайте образец текстового файла, который содержит целые числа и числа с плавающей запятой.

x = 1:1:5;
y = [x;rand(1,5)];
fileID = fopen('nums2.txt','w');
fprintf(fileID,'%d %4.4f\n',y);
fclose(fileID);

Просмотрите содержимое файла.

type nums2.txt
1 0.8147
2 0.9058
3 0.1270
4 0.9134
5 0.6324

Откройте файл для чтения и получите идентификатор файла, fileID.

fileID = fopen('nums2.txt','r');

Задайте формат считываемых данных и форму выходного массива.

formatSpec = '%d %f';
sizeA = [2 Inf];

Считайте данные файла, заполняя выходной массив, A, в порядке столбца. fscanf повторно использует формат, formatSpec, по всему файлу.

A = fscanf(fileID,formatSpec,sizeA)
A = 2×5

    1.0000    2.0000    3.0000    4.0000    5.0000
    0.8147    0.9058    0.1270    0.9134    0.6324

fclose(fileID);

Транспонируйте массив так, чтобы A соответствует ориентации данных в файле.

A = A'
A = 5×2

    1.0000    0.8147
    2.0000    0.9058
    3.0000    0.1270
    4.0000    0.9134
    5.0000    0.6324

Пропустите определенные символы в файле примера и верните только числовые данные.

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

str = '78°C 72°C 64°C 66°C 49°C';
fileID = fopen('temperature.dat','w');
fprintf(fileID,'%s',str);
fclose(fileID);

Считайте цифры в файле, пропуская текст, ° C. Также возвращает количество значений, которые fscanf читает. Расширенный ASCII код 176 представляет знак степени.

fileID = fopen('temperature.dat','r');
degrees = char(176);
[A,count] = fscanf(fileID, ['%d' degrees 'C'])
fclose(fileID);
A =

    78
    72
    64
    66
    49


count =

     5

A - вектор, содержащий числовые значения в файле. count указывает, что fscanf считайте пять значений.

Входные параметры

свернуть все

Идентификатор файла открытого текстового файла, заданный как целое число. Перед чтением файла с fscanf, вы должны использовать fopen чтобы открыть файл и получить fileID.

Типы данных: double

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

Numeric Fields

В этой таблице перечислены доступные спецификаторы преобразования для числовых входов. fscanf преобразует значения в их десятичное (базовое 10) представление.

Численный тип поляСпецификатор преобразованияПодробнее

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

%d

Основа 10

%i

Значения в файле определяют основу:

  • Значение по умолчанию является базовым 10.

  • Если начальные цифры 0x или 0Xзатем значения являются шестнадцатеричными (основание 16).

  • Если начальная цифра 0затем значения восьмеричны (основание 8).

%ld или %li

64-разрядные значения, базовые 10, 8 или 16

Целое число, без знака

%u

Основа 10

%o

База 8 (октальная)

%x

Основание 16 (шестнадцатеричное)

%lu, %lo, %lx

64-разрядные значения, базовые 10, 8 или 16

Число с плавающей запятой

%f

Поля с плавающей точкой могут содержать любое из следующих полей (без учета регистра): Inf, -Inf, NaN, или -NaN.

%e

%g

Character Fields

В этой таблице перечислены доступные спецификаторы преобразования для вводов символов.

Тип символьного поляСпецификатор преобразованияОписание

Вектор символов или строковый скаляр

%s

Считывайте все символы, за исключением белых пространств.

%c

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

Соответствие шаблона

%[...]

Считывайте только символы в скобках до первого несоответствующего символа или белого пространства.

Пример: %[mus] читает 'summer ' как 'summ'.

Если formatSpec содержит комбинацию числовых и символьных спецификаторов, а затем fscanf преобразует каждый символ в его числовой эквивалент. Это преобразование происходит, даже когда формат явно пропускает все числовые значения (для примера formatSpec является '%*d %s').

Optional Operators

  • Поля и символы, которые нужно игнорировать

    fscanf считывает все числовые значения и символы в файле последовательно, если только вы не сказали ему игнорировать конкретное поле или фрагмент поля. Чтобы пропустить поля, вставьте звездочку (*) после знака процента (%). Для примера, чтобы пропустить целые числа, задайте %*d.

  • Ширина поля

    Чтобы задать максимальное количество цифр или текстовых символов для чтения за раз, вставьте число после символа процента. Для примера, %10c считывает до 10 символов за раз, включая белое пространство. %4f считывает до 4 цифр за раз, включая десятичную точку.

  • Буквенный текст, который нужно игнорировать

    fscanf игнорирует указанный текст, добавленный к formatSpec спецификатор преобразования.

    Пример: Level%u читает 'Level1' как 1.

    Пример: %uStep читает '2Step' как 2.

Размерности массива выхода, A, заданный как Inf, целое число или двухэлементный вектор-строка.

Форма sizeA ВходОписание
InfЧтение в конец файла.
Для числовых данных выход, A, является вектор-столбец.
Для текстовых данных, A является вектор символов.
nЧитать самое большее n числовые значения или символьные поля.
Для числовых данных выход, A, является вектор-столбец.
Для текстовых данных, A, является вектор символов.
[m,n]Читать самое большее m* n числовые значения или символьные поля. n можно Inf, но m невозможно. Выход, A, есть m-by- n, заполненный в порядке столбца.

Выходные аргументы

свернуть все

Данные файла, возвращенные как вектор-столбец, матрица, вектор символов или символьного массива. Класс и размер A зависят от formatSpec вход:

  • Если formatSpec содержит только числовые спецификаторы, тогда A является числовым. Если вы задаете sizeA аргумент, затем A - матрица заданного размера. В противном случае A является вектор-столбец. Если вход содержит меньше sizeA значения, затем fscanf прокладки A с нулями.

    • Если formatSpec содержит только 64-разрядные целочисленные спецификаторы со знаком, тогда как A является классом int64.

    • Если formatSpec содержит только 64-разрядные беззнаковые целочисленные спецификаторы, затем A является классом uint64.

    • В противном случае A является классом double.

  • Если formatSpec содержит только спецификаторы символов или текстов (%c или %s), затем A представляет собой символьный массив. Если вы задаете sizeA и вход содержит меньше символов, тогда fscanf прокладки A с char(0).

  • Если formatSpec содержит комбинацию числовых и символьных спецификаторов, а затем A является числовым, из класса double, и fscanf преобразует каждые текстовые символы в его числовой эквивалент. Это происходит даже при formatSpec явным образом пропускает все числовые поля (для примера, formatSpec является '%*d %s').

  • Если MATLAB® не может соответствовать файл данным formatSpec, затем A может быть числовым или символьным массивом. Класс A зависит от значений, которые fscanf считывает, прежде чем прекратить обработку.

Количество прочитанных символов, возвращенных в виде скалярного значения.

Совет

  • Спецификаторы формата для функций чтения sscanf и fscanf отличаются от форматов функций записи sprintf и fprintf. Функции считывания не поддерживают поле точности. Поле width задает минимум для записи, но максимум для чтения.

Алгоритмы

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

Расширенные возможности

.
Представлено до R2006a