
Позиционирование файла
При считывании и записи файлов они условно представляются в виде линейно
расположенных данных, наподобие записи на непрерывной магнитной ленте.
Место, с которого идет считывание в данный момент (или позиция, начиная с которой идет запись), определяется специальным указателем. Файлы последовательного доступа просматриваются строго от начала до конца, а в файлах произвольного доступа указатель может быть размещен в любом месте, начиная с которого ведется запись или считывание данных файла.
Таким образом, указатель обеспечивает позиционирование файлов. Имеется
ряд функций позиционирования:
• eofstat = feof(fid) проверяет, достигнут ли конец файла с идентификатором fid. Возвращает 1, если указатель установлен на конец файла, и 0 в противном случае;
• message = ferror(fid) возвращает сведения об ошибке в виде строки message. Аргумент fid – идентификатор открытого файла (см. функцию fopen с ее подробным описанием);
• message = ferror(fid,'clear') очищает индикатор ошибки для заданного файла;
• [message,errnum] = ferror(…) возвращает номер ошибки errnum последней операции ввода-вывода для заданного файла.
Если последняя операция ввода-вывода, выполненная для определенного значением fid файла, была успешной, значение message – это пустая строка, а errnum принимает значение 0.
Значение errnum, отличное от нуля, говорит о том, что при последней операции ввода-вывода произошла ошибка. Параметр message содержит строку, содержащую информацию о характере возникшей ошибки.
Пример:
>> fid=fopen('c:\example1','a+')
fid = 3
>> t = fread(3,[4,5])
t =
Empty matrix: 4-by-0
>> ferror(3)
ans =
Is the file open for reading? . . .
• frewind(fid) устанавливает указатель позиции в начало файла с идентификатором fid;
• status = fseek(fid,offset,origin) – устанавливает указатель в файле с идентификатором fid в заданную позицию – на байт, указанный параметром offset относительно origin.
Аргументы:
• fid – идентификатор файла, возвращенный функцией fopen;
• offset – значение, которое интерпретируется следующим образом:
• offset>0 – изменяет позицию указателя на offset байт в направлении к концу файла;
• offset=0 – не меняет позицию указателя;
• offset<0 – изменяет позицию указателя на offset байт в направлении к началу файла;
• origin – аргумент, принимающий следующие значения:
– 'bof' или –1 – начало файла;
– 'cof' или 0 – текущая позиция указателя в файле;
– 'eof' или 1 – конец файла;
• status – выходной аргумент. Принимает значение 0, если операция fseek прошла успешно, и –1 в противном случае. Если произошла ошибка, используйте функцию ferror для получения более подробной информации.
• position=ftell(fid) – возвращает позицию указателя для файла с идентификатором fid, полученным с помощью функции fopen. Выходной аргумент position – неотрицательное целое число, определяющее позицию указателя в байтах относительно начала файла. Если запрос был неудачным, position принимает значение –1. Используйте функцию ferror для отображения характера ошибки. Примеры:
>> fid=fopen('c:\example','a+')
fid = 3
>> count = fwrite(3,magic(6))
count = 36
>> ftell(3)
ans = 36
>> frewind(3);ftell(3)
ans = 0
>> fseek(3,12,0);ftell(3)
ans = 12
>> feof(3)
ans = 0
>> fclose(3)
ans = 0
• s=sprintf(format,A,…) форматирует данные в матрице A в формате, заданном параметром format, и создает из них строковую переменную s.
• [s,errrmsg] = sprintf(format,A,…) аналогична ранее описанной функции, но дополнительно возвращает строку ошибки errmsg, если ошибка имела место, или пустую строку в противном случае. Строка format определяет систему счисления, выравнивание, значащие цифры, ширину поля и другие атрибуты выходного формата. Она может содержать обычные символы наряду со спецификаторами, знаками выравнивания и т. д. Функция fprintf ведет себя, как и аналогичная функция fprintf() языка ANSI C с некоторыми исключениями и расширениями. Примеры:
>> sprintf('%0.5g',(1+sqrt(7))/4)
ans = 0.91144
>> sprintf('%s','привет')
ans =
привет
Функция sscanf аналогична функции fscanf, за исключением того, что она считывает данные из символьной переменной системы MATLAB, а не из файла.
• A = sscanf(s,format) считывает данные из символьной переменной s, преобразует их согласно значению format и создает на основе этих данных матрицу А. Параметр format определяет формат данных, которые нужно считать.
• A = sscanf(s,format,size) считывает количество данных, определенное параметром size, и преобразует их согласно строке format. Параметр size представляет собой аргумент, определяющий количество данных для чтения. Допустимы следующие значения:
– n – чтение n элементов в вектор-столбец;
– inf – чтение элементов до конца символьной переменной и помещение
их в вектор_столбец, содержащий такое же количество элементов, как и в строковой переменной;
– [m,n] – считывает столько элементов, сколько требуется для заполнения матрицы размера m×n. Заполнение происходит по столбцам. Величина n (но не m!) может принимать значение Inf.
• [A,count,errmsg,nextindex] = sscanf(…)считывает данные из символьной переменной s, преобразует их согласно значению format и возвращает в матрицу А. Параметр count – выходной аргумент, который возвращает число успешно считанных элементов; errmsg – выходной аргумент, который возвращает строку ошибки, если ошибка произошла, и пустую строку в противном случае; nextindex – выходной аргумент, который содержит число, на единицу большее, чем количество символов в s.
Строка format состоит из обычных символов и спецификаторов. Спецификаторы указывают тип данных и включают в себя символ %, опцию ширины поля и
символы формата. Пояснения можно найти в описании функции fscanf.
Пример:
>> s = '4.83 3.16 22 45';
>> [A,n,err,next] = sscanf(s,'%f')
A =
4.8300
3.1600
22.0000
45.0000
n = 4
err = ''
next = 16
Может пригодиться
Считать файл *.txt в массив строк можно, например, так
mas='';
f=fopen('as.txt','rt');
while feof(f)==0
line=fgetl(f);
mas=char(mas,line);
end
fclose(f);
disp(mas)
Примечание: Диалоговый ввод осуществляется командой input (ее формат указан в лекции по средствам программирования)