Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МетодичкаИПлб.doc
Скачиваний:
39
Добавлен:
08.05.2019
Размер:
6.96 Mб
Скачать

4.3. Чтение чисел из текстового файла

Если данные в текстовый файл f1 были записаны в определенном формате, то прочитать их с преобразованием к числовым значениям можно с помощью функции fscanf, обращение к которой следующее

[arr n]=fscanf(f1, 'СписокФорматов', КоличествоЧисел)

Первый входной аргумент является идентификатором файла, открытого для чтения, второй – строка с кодами форматов, которые определяют вид преобразования считываемых значений, третий необязательный входной аргумент – количество чисел, которое следует ввести. Если количество запрашиваемых чисел не указано, то данные будут прочитаны до конца файла. Если количество запрашиваемых данных задано числом, то считываемые значения будут размещены в векторе-столбце. Указав количество запрашиваемых чисел в виде вектора [m n], можно прочитать данные из файла в матрицу m×n.

Первым выходным параметром является имя принимающего массива, в элементы которого будут размещены считываемые данные. Второй выходной параметр – счетчик количества фактически прочитанных значений (является необязательным).

Коды формата, указываемые в списке форматов функции fscanf, практически такие же, как и для функции fprintf (см. табл. 9.1). При этом следует помнить, что вводимые значения и вещественные и целочисленные преобразуются в машинный формат типа double. В связи с этим задание полей w.n при вводе не используется.

Пример. В файл на диске matrix.txt записывается матрица 3×3. Затем файл открывается для чтения и из него в переменную y считывается все содержимое как матрица 3×3.

f=fopen('matrix.txt','wt');

x=[11 12 13; 21 22 23; 31 32 33];

fprintf(f,'%4d',x);

fclose(f);

f=fopen('matrix.txt','rt');

y=fscanf(f,'%d',[3 3])

y =

11 12 13

21 22 23

31 32 33

Примечание: в файл matrix.txt' элементы матрицы записываются в том порядке, в каком они располагаются в рабочем пространстве – в одну строку столбец за столбцом.

Если форматный код начинается с комбинации %*, то соответствующее значение, считанное из файла, в принимающий массив не передается. Это дает возможность пропускать ненужные данные.

Пример. Из файла 'matrix.txt' предыдущего примера прочитать только элементы главной диагонали матрицы

y=fscanf(f,'%d%*d%*d%*d')

y =

11

22

33

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

Альтернативное чтение из текстового файла позволяет реализовать функция textread, синтаксис которой в простейшем случае следующий:

МассивПриемник=textread('ИмяФайла')

Обращение к файлу в этом случае выполняется по его имени (путь\имя_файла.расширение), а не по номеру заранее открытого файла. Таким образом, не требуется предварительное открытие файла для чтения и последующее его закрытие. Если текстовый файл содержит только числовую информацию, то при чтении функцией textread можно не задавать строку форматных преобразований.

Пример. В файл file1.txt записывается строка из пяти чисел в формате %3d – три позиции под одно значение целого (символы двухзначного целого числа в файле будут выровнены по правому краю поля, в итоге перед каждым числом будет по одному пробелу). Затем из файла считывается столько чисел, сколько есть. В результате переменная numbers будет вектором-строкой из пяти целых чисел.

f=fopen('file1.txt','wt');

fprintf(f,'%3d',11,12,13,14,15);

fclose(f);

numbers=textread('file1.txt')

numbers =

11 12 13 14 15

Примечание: следует помнить, что в конце каждой строки, завершающейся символом признака конца (парой символов CR и LF), считывается CR, который будет интерпретирован как число 0. Если за последним числом в строке в текстовый файл будет выведен пробел, то при чтении без указания форматов этот пробел также будет преобразован в ноль.

f=fopen('file1.txt','wt');

fprintf(f,'%2d ',11,12,13,14,15);

fclose(f);

numbers=textread('file1.txt')

Этот пример отличается от предыдущего только форматом вывода. '%2d ' предполагает за полем числа из двух символов выводится пробел. В результате переменная numbers будет вектором-строкой из шести целых чисел (пробел за числом 15 преобразован в число 0)

numbers =

11 12 13 14 15 0

Если задавать форматы преобразования, то можно управлять потоком данных. Например, чтобы читать не все данные, записанные в файл, в списке входных параметров textread необходимо указать форматную строку и количество запрашиваемых чисел

numbers=textread('file1.txt', '%d', 2)

numbers =

11

12

Данные можно прочитать не только в один массив, но и разбросать их по отдельным переменным. Но при этом каждой выходной переменной должен соответствовать свой формат

[n1 n2 n3 n4 n5]=textread('file1.txt','%d%d%d%d%d')

n1 =

11

n2 =

12

n3 =

13

n4 =

14

n5 =

15

Если в списке выходных переменных указано меньше элементов, чем чисел, записанных в файл, то чтение повторяется до тех пор, пока все данные файла не будут размещены

[n1 n2]=textread('file1.txt','%d%d')

n1 =

11

13

15

n2 =

12

14

Внимание: при использовании textread следует помнить, что каждое обращение к функции инициализирует чтение от начала файла.

n1=textread('file1.txt','%d',2)

n2=textread('file1.txt','%d',2)

n1 =

11

12

n2 =

11

12

Увы, n2 не будет содержать числа 13 и 14.

Пропустить несколько строк от начала файла перед чтением данных позволяет дополнительный входной параметр 'headerlines'. Например, прочитать таблицу, хранящуюся в файле result.txt (см. п. 3.2) можно следующим образом:

[x y]=textread('rezult.txt','%f%f','headerlines',2);

disp(' x sin(x)')

disp([x y])

x sin(x)

-1.5708 -1.0000

-1.0472 -0.8660

-0.5236 -0.5000

0 0

0.5236 0.5000

1.0472 0.8660

1.5708 1.0000

От начала файла result.txt пропускаются две строки поясняющего текста (шапка таблицы), затем до конца файла строка за строкой считывается числовая информация и размещается в переменных x и y.