Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




 

4.1. Последовательное чтение строк

Для считывания строк из открытого текстового файла используется функция fgetl

СтроковаяПеременная =fgetl(ИдентификаторФайла)

Входным ее аргументом является идентификатор файла, присвоенный ему при открытии, а выходным – строковая переменная. Каждое обращение к fgetl позволяет поочередно считывать строки по одной от начала до конца файла. Символы признака конца строки не считываются. Каждый fgetl считывает символы текущей строки до тех пор, пока не встретится признак конца строки или не будут исчерпаны все символы файла. Таким образом, с помощью fgetl нельзя прочитать один или несколько символов строки. Только строку целиком! Например, если открытый ранее для чтения файл data.txt содержит следующую информацию (символ ⌂ обозначает пробел, признаки конца первой и второй строк не показаны)

1⌂12⌂-7⌂

-4.5⌂6⌂0.512⌂

123⌂55.5⌂1

то прочитать все данные можно, выполнив следующий фрагмент:

s1=fgetl(f1)

s2=fgetl(f1)

s3=fgetl(f1)

в результате получим три текстовые строки длиной 8, 13 и 10 символов соответственно

s1 =

1⌂12⌂-7⌂

s2 =

-4.5⌂6⌂0.512⌂

s3 =

123⌂55.5⌂1

Это будет именно текст, а не числа! Преобразовать последовательность символов в числа можно с помощью str2num. При этом пробелы воспринимаются как разделители чисел. Например

n1=str2num(s1)

n1 =

1 12 -7

В результате n1 будет являться вектором-строкой из трех чисел, над которыми можно выполнять арифметические операции.

Внимание: попытка считать из файла больше строк, чем в нем храниться или чтение из пустого файла не вызывают аварийного завершения программы. Выходные переменные при этом получают значения, равные минус один. Во избежание недоразумений чтение из файла лучше выполнять в цикле while до тех пор, пока не будет достигнут конец файла. Контроль достижения конца файла осуществляет функция feof, входным аргументом которой является идентификатор файла. Функция возвращает логическую единицу, если при чтении достигнут конец файла (нет больше строк для чтения), и логический ноль в противном случае.

[f1,message]=fopen('data.txt','rt');

if f1~= -1

s=[];

while feof(f1)==0

s=[s fgetl(f1)];

end

n=str2num(s)

else

disp(['Error: ' message])

end

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

n =

Columns 1 through 6

1.0000 12.0000 -7.0000 -4.5000 6.0000 0.5120

Columns 7 through 9

123.0000 55.5000 1.0000

Считать данные из файла data.txt, рассмотренного выше, в виде матрицы 3×3 можно следующим образом:

a=[];

while feof(f1)==0

a=[a; str2num(fgetl(f1))];

end

Таким образом, строки символов считываются из текстового файла просто, а для чтения числовой информации необходимо предпринять дополнительные меры по преобразованию типа.

4.2. Последовательное чтение нескольких символов

Один или несколько символов строки можно прочитать из текстового файла с помощью функции fgets, у которой могут быть один или два входных аргумента – идентификатор файла и количество считываемых символов. Чтение начинается с текущей позиции строки и продолжается до тех пор, пока не будет прочитано указанное количество символов либо пока не встретится признак конца строки (символ LF признака конца строки считывается), или данные не исчерпаются. При попытке прочитать больше данных, чем возможно, функция fgets возвращает значение -1.

Пример. Пусть файл num.txt содержит одну строку – цепочку из пяти символов '12345'. Тогда выполнение программы

f3=fopen('num.txt','rt');

d1=fgets(f3,2)

d2=fgets(f3,3)

d3=fgets(f3,1)

приведет к получению следующих результатов:

d1 =

d2 =

d3 =

-1

Причем переменные d1 и d2 будут строками из двух и трех символов соответственно, а d3 – числовой переменной.

 

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 =

 

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 =

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

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

 

n1 =

n2 =

n3 =

n4 =

n5 =

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

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

n1 =

n2 =

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

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

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

n1 =

n2 =

Увы, 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.

 




Поделиться с друзьями:


Дата добавления: 2014-11-08; Просмотров: 836; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.031 сек.