Операции над форматированными файлами:



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

· line = fgetl (fid) – возвращает строку из файла с идентификатором fid с удалением символа конца строки. Если функция fgetl обнаруживает конец файла, то она возвращает значение – 1 (см. функцию fopen с более подробным описанием fid);

· line = f gets (fid) – возвращает строку из файла с идентификатором fid, не удаляя символ конца строки. Если функция fgets обнаруживает конец файла, то она возвращает значение – 1;

· line = fgets(fid.nchar) – возвращает не больше чем nchar первых символов строки. После признака конца строки или конца файла никакие дополнительные символы не считываются (см. примеры к функции fscanf);

· count = fprintf(fid.format,A….) – форматирует данные, содержащиеся в действительной части матрицы А, под контролем строки format и записывает их в файл с идентификатором fid. Функция fprintf возвращает число записанных байтов. Значение идентификатора fid – целое число, возвращаемое функцией fopen.

Если опустить идентификатор fid в списке аргументов функции fprintf, то вывод будет осуществляться на экран, так же как при использовании стандартного вывода (fid=l).

· fprintf(format,A….) – запись осуществляется на стандартное устройство – экран (но не в файл). Строка format определяет систему счисления, выравнивание, значащие цифры, ширину поля и другие атрибуты выходного формата. Она может содержать обычные буквы алфавита наряду со спецификаторами, знаками выравнивания и т. д.

Таблица 19.1. Специальные символы в строках формата.

Символ Описание
\n Новая строка
\t Горизонтальная табуляция
\b Возврат на один символ
\r Возврат каретки
\f Новая страница
\\ Обратный слеш
\" или" Одиночная кавычка
%% Процент

Функция fprintf ведет себя, как аналогичная функция fprintf () языка ANSI С и с некоторыми исключениями и расширениями. В табл. 19.1 описаны специальные символы, встречающиеся в строке format. Для вывода числовых или символьных данных в строке формата необходимо использовать спецификаторы, перечисленные в табл. 19.2.

Таблица 19.2. Спецификаторы формата вывода данных.

Спецификатор Описание
%d Десятичная система обозначений (со знаком)
Одиночный символ
Экспоненциальное представление чисел с использованием символа "е" в нижнем регистре, например 3.1415е + 00
Экспоненциальное представление чисел с использованием символа "Е" в верхнем регистре, например 3.1415Е + 00
%f Система обозначений с фиксированной точкой
%g Наиболее компактный вариант из %е и %f. Незначащие нули не выводятся
%G То же самое, что и %д, но используется верхний регистр для символа "Е"
Восьмеричная система обозначений (без знака)
%s Строка символов
%u Десятичная система обозначений (без знака)
%x Шестнадцатеричная система обозначений с использованием символов нижнего регистра ("a"…"f")
%X Шестнадцатеричная система обозначений с использованием верхнего регистра символов ("A"…"F")

Между знаком процента и буквой в спецификатор могут быть вставлены дополнительные символы. Их значение поясняет табл. 19.3.

Таблица 19.3. Параметры спецификаторов формата.

Символ Описание Пример
Знак "минус" (-) Выравнивание преобразованных аргументов по левому краю %-5.2d
Знак "плюс" (+) Всегда печатать знак числа (+ или – ) %+5.2d
Ноль (0) Заполнение нулями вместо пробелов %05.2d
Цифры Определяет минимальное число знаков, которые будут напечатаны %6f
Цифры (после точки) Число после точки определяет количество символов, печатаемых справа от десятичной точки %6.2f

· А = fscanf(fid,format) – читает все данные из файла с идентификатором, fid, преобразует их согласно значению параметра format и возвращает в виде матрицы А. Значение идентификатора fid – целое число, возвращаемое функцией fopen. Параметр format представляет собой строку, определяющую формат данных, которые необходимо прочитать;

· [A,count] = fscanf(fid.format,size) – считывает количество данных, определенное параметром size, преобразует их в соответствии с параметром format и возвращает вместе с количеством успешно считанных элементов count. Параметр size – это произвольный аргумент, определяющий количество считываемых данных. Допустимы следующие значения:

o n – чтение п элементов в вектор-столбец;

o inf – чтение элементов до конца файла и помещение их в вектор-столбец, содержащий такое же количество элементов, что и в файле;

o [m,n] – считывает столько элементов, сколько требуется для заполнения матрицы размера тхп. Заполнение происходит по столбцам. Величина n (но нет!) может принимать значение Inf.

Строка format состоит из обычных символов и (или) спецификаторов. Спецификаторы указывают тип считываемых данных и включают символ %, опцию ширины поля и символы формата. Возможные символы формата перечислены в табл. 19.4.

Таблица 19.4. Символы формата, используемые функцией fscanf.

Символ Описание
%c Последовательность символов; параметр ширины поля определяет количество считываемых символов
%d Десятичное число
%e, %f, %g Число с плавающей точкой
%i Целое число со знаком
%o Восьмеричное число со знаком
%s Последовательность непробельных символов
%u Десятичное целое число со знаком
%x Шестнадцатеричное целое число со знаком
[…] Последовательность символов

Между символом % и символом формата допустимо вставлять следующие символы:

· звездочка (*) означает, что соответствующее значение не нужно сохранять в выходной матрице;

· строка цифр задает максимальную ширину поля;

· буква обозначает размер полученного объекта: h для короткого целого числа (например, %n d), 1 для длинного целого числа (например, %1d) или для числа с двойной точностью с плавающей запятой (например, % lg).

Примеры:

>> x = 0:pi/10:pi:y-[x:sin(x)];

>> fid = fopent 'c:\sin.txt'. V);

>> fprintf(fid.'X5.3f *10.6f\n'.y):fclose(fid);

0.000 0.000000

0.314 0.309017

0.628 0.587785

0.942 0.809017

1.257 0.951057

1.571 1.000000

1.885 0.951057

2.199 0.809017

2.513 0.587785

2.827 0.309017

3.142 0.000000

>> fid = fopen('c:\sin.txt'.'r');

>> q=fscanf(fid.'*g'.[2.10]):

>> q

ans =

0 0

0.3140 0.3090

0.6280 0.5878

0.9420 0.8090

1.2570 0.9511

1.5710 1.0000

1.8850 0.9511

2.1990 0.8090

2.5130 0.5878

2.8270 0.3090

>> fgetl(fid)

ans =

3.142 0.000000

>> fgets(fid)

ans =

-1

>> fclose(fid)

ans=

0

Операции над строками:

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

· findstr(str1,str2) – обеспечивает поиск начальных индексов более короткой строки внутри более длинной и возвращает вектор этих индексов. Индексы указывают положение первого символа более короткой строки в более длинной строке.

Пример:

>> str1='Example of the function Is the findstr function';

>> str2='the';

>> k = findstr(str1,str2)

k =

12 28

· lower('str') – возвращает строку символов str, в которой символы верхнего регистра переводятся в нижний регистр, а все остальные символы остаются без изменений.

Пример:

>> str='Example Of The Function';

>> t=lower(str)

t =

example of the function

· upper('str') – возвращает строку символов str, в которой все символы нижнего регистра переводятся в верхний регистр, а все остальные символы остаются без изменений.

Пример:

>> str='danger!';

>> t = upper(str)

t =

DANGER!

· strcat(s1,s2,s3,…) – выполняет горизонтальное объединение соответствующих рядов массивов символов s1, s2, s3 и т. д., причем пробелы в конце каждого ряда отбрасываются, и возвращает объединенную строку (ряд) результирующего массива символов, пробелы добавляются заново после анализа строк в полученном массиве. Все входные массивы должны иметь одинаковое число строк (в частном случае должны быть представлены в виде одной строки символов), но если один из входных аргументов – не массив символов, а строковый массив ячеек, то любой из других входных аргументов может быть скаляром или любым массивом той же размерности и того же размера. Если входной массив состоит только из символов, то выходной массив также будет являться массивом символов. Если любой из входных массивов является строковым массивом ячеек, то функция strcat возвращает строковый массив ячеек, сформированный из объединенных соответствующих элементов массивов s1, s2, s3. при этом любой из элементов может быть скаляром и т. д.

Примеры:

>> s1{1.2}='book':

>> s1 s1 =

'Home' 'book'

>> s2{ 1.1}= 'home':

>> s2{ 1.2}= 'reading';

>> s2 s2 =

'home' 'reading'

>> t = strcat(s1.s2)

t =

'Homehome' 'book read ing'

>> s1=['wri ']

s1 =wri

>> s2=['ter']

s2 =ter

>> t = strcat(s1.s2)

t =

writer

· strvcat(t1,t2,t3….) – выполняет вертикальное объединение строк t1, t2, t3,.. в массив символов S аналогично char(t1,t2.t3….). Пример:

>> t1=['string'];

>> t2=['concatenation']:

>> S = strvcat(t1.t2)

S =

string concatenation

· strcmp('str1'. 'str2') – возвращает логическую единицу, если две сравниваемые строки str1 и str2 идентичны, и логический ноль в противном случае;

· TF = strcmp(S.T) – возвращает строковый массив ячеек TF, содержащий единицы для идентичных элементов массивов S и Т и нули для всех остальных, причем если один из массивов – не массив символов, а строковый массив ячеек, то перед сравнением из сравниваемых копий рядов массива символов удаляются пробелы в конце строк. Массивы S и Т должны иметь одинаковый размер, или один из них может быть скалярной ячейкой.

Примеры:

>> str1='computer';

>> str2='computer';

>> k = strcmp(str1.str2)

k =

1

>> S{1.1}='first';

>> S{1.2}='second':

>> S S =

'first''second'

>> T{1.1}='third';

>> TF = strcmp(S.T)

TF =

0 0

>> T{1.1}='second';

>> TF - strcmp(S.T)

TF =

0 1

· strncmp('strT, 'str2',n) – возвращает логическую единицу, если две сравниваемые строки str1 и str2 содержат n первых идентичных символов, и логический ноль в противном случае. Аргументы str1 и str2 могут быть также строковыми массивами ячеек.

· TF = strncmp(S,T,n) – возвращает строковый массив ячеек TF, содержащий единицы для идентичных (до n символов) элементов массивов S и Т и нули для всех остальных.

Примеры:

>> str1='computer'

str1 =

computer

>> str1='computer for me'

str1 =

computer for me

>> k = strncmp(str1.str2.3)

k =

1

>> k = strncmp(str1,str2.12)

L =

0

· strmatch('str',STRS, 'exact') – возвращает только индексы строк символов массива STRS, точно совпадающих со строкой символов str;

· strjust(S) – возвращает выровненный вправо массив символов (т. е. перемещает пробелы в конце рядов массива символов, если они есть, в начало тех же рядов) [Функция strjusttS, 'left') возвращает массив символов, где все строки выровнены влево, a strjusttS. 'center') – где все строки выровнены по центру.– Примеч.ред.];

· strmatch('str',STRS) – просматривает массив символов или строковый массив ячеек STRS по строкам, находит строки символов, начинающиеся с строки str, и возвращает соответствующие индексы строк;

Пример:

>> STRS{1.1}='character':

>> STRS{1.2}='array';

>> STRS{2.1}='character array':

>> STRS{2.2}='string':

>> STRS

STRS =

'character' 'array'

'character array' 'string'

>> i = strmatchCcharac.STRS)

i =

1

2

>>i = strmatch('character'.STRS.'exact')

i =

1

· strrep(str1,str2,str3) – заменяет все подстроки str2, найденные внутри строки символов str1 на строку str3;

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

Пример:

>> strl='This is a good example for me.':

>> str2='good';

>> str3='best';

>> str = strrep(str1.str2.str3)

str =

This is a best example for me.

· strtok(str'.delimiter) – возвращает часть текстовой строки str, ограниченную с ее конца разделителем delimiter. Символы-разделители в начале строки игнорируются. Вектор delimiter содержит возможные символы-разделители;

· strtok('str') – использует символ-разделитель по умолчанию ("белое пространство"). Реальными символами-разделителями при этом являются символ табуляции (ASCII-код 9), символ возврата каретки (ASCII-код 13) и пробел (ASCII-код 32);

· [token,rem]=strtok(…) – возвращает остаток rem исходной строки.

Примеры:

>> str='This is a good example for me.':

>> token = strtok(str)

token =

This

>> token = strtok(str.'f')

token =

This is a good example

>> [token,rem] = strtok(str)

token =

This

rem =

is a good example for me.

Преобразование символов и строк:

· int2str(X) – округляет элементы массива X до целых чисел и возвращает массив символов, содержащих символьные представления округленных целых чисел. Аргумент X может быть скаляром, вектором или матрицей.

Пример:

>> X=magic(3)

X =

8 1 6

3 5 7

4 9 2

X=X+0.05

X =

8.0500 1.0500 6.0500

3.0500 5.0500 7.0500

4.0500 9.0500 2.0500

>> str=int2str(X)

str =

8 1 6 357 492

· mat2str(A) – преобразует матрицу А в единую строку; если элемент матрицы не скаляр, то он заменяется на [ ], при этом учитываются 15 знаков после десятичной точки;

· mat2str(A,n) – преобразует матрицу А в строку, используя точность до n цифр после десятичной точки. Функция eval(str) осуществляет обратное преобразование.

Пример:

>> rand('state');

>> A=rand(4.3)

A =

0.9501 0.8913 0.8214

0.2311 0.7621 0.4447

0.6068 0.4565 0.6154

0.4860 0.0185 0.7919

>> str = mat2str(A,2)

str =

[0.95 0.89 0.82:0.23 0.76 0.44:0.61 0.46 0.62:0.49 0.019 0.79]

· num2str(A) – выполняет преобразование массива А в строку символов str с точностью до четырех десятичных разрядов и экспоненциальным представлением, если требуется. Обычно используется при выводе графиков совместно с title, xlabel .ylabel или text;

· num2str(A,precision) – выполняет преобразование массива А в строку символов str с максимальной точностью, определенной аргументом precision. Аргумент precision определяет число разрядов в выходной строке;

· num2str(A,format) – выполняет преобразование массива чисел А, используя заданный формат format. По умолчанию принимается формат, который использует четыре разряда после десятичной точки для чисел с фиксированной или плавающей точкой.

Пример:

>> str = num2str(pi.7)

str =

3.141593

>> rand(state):

>> A=rand(3.5)

A =

0.9501 0.4860 0.4565 0.4447 0.9218

0.2311 0.8913 0.0185 0.6154 0.7382

0.6068 0.7621 0.8214 0.7919 0.1763

>> str = num2str(A,1)

str =

1 0.5 0.5 0.4 0.9 0.20.9 0.02 0.6 0.7 0.60.8 0.8 0.8 0.2

· str2double('str') – выполняет преобразование численной строки s, которая представлена в ASCII-символах, в число с двойной точностью. При этом + и – могут быть только в начале строки.

Пример:

>> x = str2double('5.45+2.67')

5.4500 + 2.67001

Обратите особое внимание на последнюю функцию, поскольку именно она в MATLAB 6 обычно обеспечивает переход от символьного представления математических выражений к их вычисленным численным значениям;

· str2num(s) – выполняет преобразование численного массива символов – матрицы или строки s, который представлен в ASCII-символах, в матрицу (массив размерности 2).

Пример:

>> x = str2num('5.45+2.67')

8.1200

Обратите особое внимание, что при этом можно вводить знаки + и – в любом месте строки. Предыдущая функция выдала бы NaN. Но фирма MathWorks рекомендует использовать str2num с осторожностью и по возможности заменять ее на str2double.

Задание:

Реализовать кодирование и декодирование информации заданным методом с использованием MatLab.

Вариант 1. Выполнить кодирование и декодирование русскоязычного текста методом Хаффмана.

Вариант 2. Выполнить кодирование и декодирование англоязычного текста методом Хаффмана.

Вариант 3. Выполнить кодирование и декодирование графического файла (BMP, GIF) методом Хаффмана.

Вариант 4. Выполнить кодирование и декодирование русскоязычного текста методом Шеннона-Фано.

Вариант 5. Выполнить кодирование и декодирование англоязычного текста методом Шеннона-Фано.

Вариант 6. Выполнить кодирование и декодирование графического файла (BMP, GIF) методом Шеннона-Фано.

Вариант 7. Выполнить кодирование и декодирование русскоязычного текста методом арифметического сжатия.

Вариант 8. Выполнить кодирование и декодирование англоязычного текста методом арифметического сжатия.

Вариант 9. Выполнить кодирование и декодирование русскоязычного текста используя алгоритм LZW.

Вариант 10. Выполнить кодирование и декодирование англоязычного текста используя алгоритм LZW.

Вариант 11 Выполнить кодирование и декодирование графического файла используя алгоритм LZW.

 

 

Отчет должен содержать описание алгоритма реализации, листинг кода с комментариями, исходные данные, результаты выполнения задания.


Дата добавления: 2019-07-17; просмотров: 128; Мы поможем в написании вашей работы!

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






Мы поможем в написании ваших работ!