removing a proprietary file that should not be here; I was using it as
a UTF-8 test case
This commit is contained in:
parent
7cdd489f86
commit
1ef3c13acf
601
llt/textread.m
601
llt/textread.m
|
@ -1,601 +0,0 @@
|
||||||
function varargout = textread(filename, format, varargin)
|
|
||||||
% textread Formatted file read to one or more variables
|
|
||||||
%
|
|
||||||
% Syntax:
|
|
||||||
% [<variable-1> <<,variable-2>> <<,variable-N>> ] = ...
|
|
||||||
% textread( <input-filename>, <format-specifiers> <<,number-of-lines-to-read>> )
|
|
||||||
%
|
|
||||||
% This function is available for task parallel processing.
|
|
||||||
%
|
|
||||||
% ************
|
|
||||||
%
|
|
||||||
% The Star-P M implementation of this function exhibits the same signature and output characteristics as the Matlab
|
|
||||||
% function of the same name.
|
|
||||||
%
|
|
||||||
% For details, please see matlab:textread.
|
|
||||||
%
|
|
||||||
% ************************
|
|
||||||
%
|
|
||||||
%
|
|
||||||
|
|
||||||
% DOC % A
|
|
||||||
if nargin < 2, error('Not enough input arguments.'); end
|
|
||||||
|
|
||||||
if ~ischar(filename), error('Filename must be a string.'); end
|
|
||||||
|
|
||||||
ifExist = exist(filename, 'file');
|
|
||||||
if ifExist ~= 2 && ifExist ~= 4, error('File not found'); end
|
|
||||||
|
|
||||||
fid = fopen(filename, 'r');
|
|
||||||
if fid == -1, error(lasterror()); end;
|
|
||||||
|
|
||||||
formatin = formatread(format);
|
|
||||||
argin = readvarargin(varargin{:});
|
|
||||||
|
|
||||||
|
|
||||||
% Проверка количества исходящих аргументов
|
|
||||||
count = 0;
|
|
||||||
for k = 1:length(formatin),
|
|
||||||
if ~isequal(formatin(k).symbol, '*'), count = count + 1; end;
|
|
||||||
end
|
|
||||||
if count ~= nargout, error('widthber of outputs must match the widthber of unskipped input fields.');end
|
|
||||||
|
|
||||||
% Флаг flag_N - опредиляет сколько раз использовать строку формата
|
|
||||||
% (N или пока не считаем весь файл)
|
|
||||||
flag_N = 1;
|
|
||||||
if ~isempty(argin.N)
|
|
||||||
N = argin.N;
|
|
||||||
else
|
|
||||||
N = 1; flag_N = 0;
|
|
||||||
end
|
|
||||||
|
|
||||||
% Пропустить первые N == headerlines линий
|
|
||||||
for i = 1:argin.headerlines
|
|
||||||
text = fgets(fid);
|
|
||||||
end
|
|
||||||
|
|
||||||
% Если строка пустая считать следующую
|
|
||||||
text = fgets(fid);
|
|
||||||
|
|
||||||
t = 1;
|
|
||||||
k = 1;
|
|
||||||
|
|
||||||
maxlen = 1;
|
|
||||||
vararginEmpty = 1;
|
|
||||||
|
|
||||||
while N
|
|
||||||
|
|
||||||
t = 1;
|
|
||||||
if ~isempty(format)
|
|
||||||
if passLine(text, argin)
|
|
||||||
for j = 1:length(formatin)
|
|
||||||
s = formatin(j);
|
|
||||||
|
|
||||||
if s.type == 'c' && isempty(text)
|
|
||||||
while 1
|
|
||||||
text = fgets(fid);
|
|
||||||
if ~ischar(text)
|
|
||||||
fclose(fid);
|
|
||||||
return;
|
|
||||||
else
|
|
||||||
if ~(text(1) == 13)
|
|
||||||
break;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
% Удалить первые лишние пробелы
|
|
||||||
text = removeAllFirstSpaces(text, argin.delimiter);
|
|
||||||
% Считать следующее слово указанного типа
|
|
||||||
[out, text] = switchType(text, s, argin, fid);
|
|
||||||
% Пропустить слово если установлен параметр *
|
|
||||||
|
|
||||||
if ~isequal(s.symbol, '*')
|
|
||||||
if ~isempty(text) || ~(isempty(out) || isequal(out, {''}))
|
|
||||||
out = setEmptyValue(out, s, argin);
|
|
||||||
if vararginEmpty
|
|
||||||
varargout{t}(1, :) = out;
|
|
||||||
else
|
|
||||||
varargout{t}(end + 1, :) = out;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
t = t + 1;
|
|
||||||
end;
|
|
||||||
|
|
||||||
% Убрать первый символ если он равен delimiter
|
|
||||||
if ~isempty(argin.delimiter) && ~isempty(text) && isa(text, 'char')
|
|
||||||
if find(argin.delimiter == text(1))
|
|
||||||
text = text(2:end);
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
end
|
|
||||||
vararginEmpty = 0;
|
|
||||||
end
|
|
||||||
else % Если строка формата не задана читать как double
|
|
||||||
|
|
||||||
if passLine(text, argin)
|
|
||||||
[out, text] = readDoubleArray(text, argin);
|
|
||||||
curmaxlen = maxlen;
|
|
||||||
if length(out) > maxlen, maxlen = length(out); end;
|
|
||||||
for z = 1:k
|
|
||||||
for q = curmaxlen+1:maxlen
|
|
||||||
varargout{1}(z, q) = argin.emptyvalue;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
for q = length(out)+1:maxlen
|
|
||||||
out(q) = argin.emptyvalue;
|
|
||||||
end
|
|
||||||
|
|
||||||
varargout{1}(k, :) = out;
|
|
||||||
k = k + 1;
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
text = removeAllFirstSpaces(text, argin.delimiter);
|
|
||||||
% Если строка пустая считать следующую
|
|
||||||
if isempty(text)
|
|
||||||
text = fgets(fid);
|
|
||||||
elseif find(text(1) == [10 13])
|
|
||||||
text = fgets(fid);
|
|
||||||
end
|
|
||||||
% Выйти если не смогли считать строку
|
|
||||||
if ~ischar(text), break; end;
|
|
||||||
|
|
||||||
if flag_N, N = N - 1; end;
|
|
||||||
end
|
|
||||||
|
|
||||||
fclose(fid);
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
% -------- Работа с текстом ---------------------------
|
|
||||||
|
|
||||||
% Удаляет все первые разделители
|
|
||||||
function text = removeAllFirstSpaces(text, delimiter)
|
|
||||||
%if ~isempty(delimiter), return; end;
|
|
||||||
idx = [];
|
|
||||||
for k = 1:length(text)
|
|
||||||
idx = find(text(k) ~= ' ', 1);
|
|
||||||
if ~isempty(idx), break; end;
|
|
||||||
end
|
|
||||||
if ~isempty(idx)
|
|
||||||
text = text(k:end);
|
|
||||||
else
|
|
||||||
text = '';
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
% Читает первые n - символов
|
|
||||||
function [word, text] = readCharacters(text, n, fid)
|
|
||||||
word = '';
|
|
||||||
while n
|
|
||||||
if n > length(text)
|
|
||||||
word = [word text(1:end)];
|
|
||||||
n = n - length(text);
|
|
||||||
text = fgets(fid);
|
|
||||||
if ~ischar(text), error(sprintf('Trouble reading characters from file: %s', text)); end
|
|
||||||
else
|
|
||||||
word = [word text(1:n)];
|
|
||||||
text = text(n+1:end);
|
|
||||||
n = 0;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
% Читает первое слово до разделитель или первые n - символов
|
|
||||||
function [word, text] = readString(text, n, delimiter)
|
|
||||||
if isempty(delimiter), delimiter = [13, 10, 32];
|
|
||||||
else
|
|
||||||
delimiter = [delimiter, 13, 10];
|
|
||||||
end
|
|
||||||
|
|
||||||
word = '';
|
|
||||||
if isempty(n) || n > length(text) , n = length(text); end;
|
|
||||||
for k = 1:n
|
|
||||||
if find(delimiter == text(k))
|
|
||||||
word = text(1:k-1);
|
|
||||||
text = text(k:end);
|
|
||||||
return;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
word = text(1:k);
|
|
||||||
text = text(k+1:end);
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
% Читает первые числа до разделителяили или первые n - символов
|
|
||||||
function [word, text] = readNumber(text, n)
|
|
||||||
|
|
||||||
if isempty(text), word = ''; end;
|
|
||||||
|
|
||||||
word = [];
|
|
||||||
if isempty(n) || length(text) < n, n = length(text); end;
|
|
||||||
|
|
||||||
for k = 1:n
|
|
||||||
if text(k) < 48 || text(k) > 57
|
|
||||||
word = text(1:k-1);
|
|
||||||
text = text(k:end);
|
|
||||||
return;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
word = text(1:k);
|
|
||||||
text = text(k+1:end);
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
% Читает число с точкой до разделителяили или первые n - символов
|
|
||||||
function [word, text] = readFloat(text, s)
|
|
||||||
|
|
||||||
if isempty(text), word = ''; return; end;
|
|
||||||
|
|
||||||
if isempty(s), s.width = []; s.precision = []; end;
|
|
||||||
|
|
||||||
if isempty(s.width) || length(text) < s.width
|
|
||||||
n = length(text);
|
|
||||||
else
|
|
||||||
n = s.width;
|
|
||||||
end;
|
|
||||||
|
|
||||||
if isempty(s.precision), s.precision = n; end;
|
|
||||||
|
|
||||||
% Чтение знака
|
|
||||||
[sign, text] = getSign(text);
|
|
||||||
if ~isempty(sign), n = n - 1; end;
|
|
||||||
|
|
||||||
point = 0;
|
|
||||||
npoint = 0;
|
|
||||||
word = sign;
|
|
||||||
for k = 1:n
|
|
||||||
if point
|
|
||||||
npoint = npoint + 1;
|
|
||||||
end
|
|
||||||
if text(k) == '.' && ~point
|
|
||||||
point = 1;
|
|
||||||
continue;
|
|
||||||
end
|
|
||||||
if text(k) < 48 || text(k) > 57 || npoint > s.precision
|
|
||||||
word = [word text(1:k-1)];
|
|
||||||
text = text(k:end);
|
|
||||||
return;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
word = [word text(1:k)];
|
|
||||||
text = text(k+1:end);
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
% Определяет знак
|
|
||||||
function [sign, text] = getSign(text)
|
|
||||||
if isempty(text), sign = ''; return; end;
|
|
||||||
if text(1) == '+' || text(1) == '-'
|
|
||||||
sign = text(1);
|
|
||||||
text = text(2:end);
|
|
||||||
if isempty(text) || text(1) < 48 || text(1) > 57, error(sprintf('Trouble reading double from file: %s', text)); end;
|
|
||||||
else
|
|
||||||
sign = [];
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
% 0 - пропустить строку, 1 - обрабатывать
|
|
||||||
function out = passLine(text, argin)
|
|
||||||
|
|
||||||
isdelimiter = 0;
|
|
||||||
if argin.delimiter
|
|
||||||
if ~isempty(find(text == argin.delimiter, 1))
|
|
||||||
isdelimiter = 1;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
isnewline = 0;
|
|
||||||
if ~isempty(find(text(1) == [10 13], 1))
|
|
||||||
isnewline = 1;
|
|
||||||
end
|
|
||||||
if ~isnewline || isdelimiter
|
|
||||||
out = 1;
|
|
||||||
else
|
|
||||||
out = 0;
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
% -------- Парс входящих параметров ---------------------------
|
|
||||||
|
|
||||||
% Читает входящие параметры в структуру
|
|
||||||
function argin = readvarargin(varargin)
|
|
||||||
|
|
||||||
|
|
||||||
argin = struct();
|
|
||||||
argin(1).N = [];
|
|
||||||
argin(1).bufsize = 4095;
|
|
||||||
argin(1).commentstyle = [];
|
|
||||||
argin(1).delimiter = '';
|
|
||||||
argin(1).emptyvalue = 0;
|
|
||||||
argin(1).endofline = [];
|
|
||||||
argin(1).expchars = [];
|
|
||||||
argin(1).headerlines = 0;
|
|
||||||
argin(1).whitespace = [];
|
|
||||||
|
|
||||||
if nargin == 0, return; end;
|
|
||||||
|
|
||||||
k = 1;
|
|
||||||
if isnumeric(varargin{1})
|
|
||||||
argin.N = varargin{1};
|
|
||||||
k = k + 1;
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
count = (length(varargin(k:end)) / 2);
|
|
||||||
if floor(count) - count ~= 0, error('Param/value pairs must come in pairs'); end;
|
|
||||||
|
|
||||||
while k < nargin
|
|
||||||
switch varargin{k}
|
|
||||||
|
|
||||||
case 'bufsize'
|
|
||||||
k = k + 1;
|
|
||||||
if isinteger(varargin{k}) && isscalar(varargin{k})
|
|
||||||
argin(1).bufsize = str2double(varargin{k});
|
|
||||||
else
|
|
||||||
error('Buffer size must be a scalar integer.');
|
|
||||||
end
|
|
||||||
|
|
||||||
case 'commentstyle'
|
|
||||||
k = k + 1;
|
|
||||||
switch varargin{k}
|
|
||||||
case 'matlab'
|
|
||||||
argin(1).commentstyle = '%';
|
|
||||||
case 'shell'
|
|
||||||
argin(1).commentstyle = '#';
|
|
||||||
case 'c++'
|
|
||||||
argin(1).commentstyle = '//';
|
|
||||||
otherwise
|
|
||||||
error('Invalid comment style.');
|
|
||||||
end
|
|
||||||
|
|
||||||
case 'delimiter'
|
|
||||||
k = k + 1;
|
|
||||||
switch varargin{k}
|
|
||||||
case '\n'
|
|
||||||
num = 10;
|
|
||||||
case '\r'
|
|
||||||
num = 13;
|
|
||||||
otherwise
|
|
||||||
num = double(varargin{k});
|
|
||||||
end
|
|
||||||
argin(1).delimiter = num;
|
|
||||||
|
|
||||||
case 'emptyvalue'
|
|
||||||
k = k + 1;
|
|
||||||
if isnumeric(varargin{k}) && isscalar(varargin{k})
|
|
||||||
argin(1).emptyvalue = varargin{k};
|
|
||||||
else
|
|
||||||
error('Emptyvalue must be a scalar double.');
|
|
||||||
end
|
|
||||||
|
|
||||||
case 'endofline'
|
|
||||||
k = k + 1;
|
|
||||||
if ischar(varargin{k})
|
|
||||||
argin(1).endofline = varargin{k};
|
|
||||||
else
|
|
||||||
error('endofline must be a scalar double.');
|
|
||||||
end
|
|
||||||
|
|
||||||
case 'expchars'
|
|
||||||
|
|
||||||
case 'headerlines'
|
|
||||||
k = k + 1;
|
|
||||||
if isnumeric(varargin{k}) && isscalar(varargin{k})
|
|
||||||
argin(1).headerlines = varargin{k};
|
|
||||||
else
|
|
||||||
error('Headerlines must be a scalar integer.');
|
|
||||||
end
|
|
||||||
|
|
||||||
case 'whitespace'
|
|
||||||
|
|
||||||
otherwise
|
|
||||||
error('Unknown option');
|
|
||||||
end
|
|
||||||
|
|
||||||
k = k + 1;
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
% Читает строку формата в структуру
|
|
||||||
function R = formatread(format)
|
|
||||||
|
|
||||||
formatType = ['d', 'u', 'f', 's', 'q', 'c'];
|
|
||||||
k = 1;
|
|
||||||
t = 1;
|
|
||||||
s = struct();
|
|
||||||
s(t).type = [];
|
|
||||||
s(t).width = [];
|
|
||||||
s(t).precision = [];
|
|
||||||
s(t).symbol = [];
|
|
||||||
s(t).text = [];
|
|
||||||
|
|
||||||
while ~isempty(format)
|
|
||||||
|
|
||||||
type = [];
|
|
||||||
width = [];
|
|
||||||
precision = [];
|
|
||||||
symbol = [];
|
|
||||||
text = [];
|
|
||||||
|
|
||||||
format = removeAllFirstSpaces(format, '');
|
|
||||||
if format(1) == '%'
|
|
||||||
format = format(2:end);
|
|
||||||
|
|
||||||
|
|
||||||
if format(1) == '*'
|
|
||||||
symbol = '*';
|
|
||||||
format = format(2:end);
|
|
||||||
end;
|
|
||||||
|
|
||||||
[width, format] = readNumber(format, []);
|
|
||||||
if format(1) == '.'
|
|
||||||
format = format(2:end);
|
|
||||||
[precision, format] = readNumber(format, []);
|
|
||||||
end
|
|
||||||
|
|
||||||
type = format(1);
|
|
||||||
format = format(2:end);
|
|
||||||
|
|
||||||
% Check and save correct format
|
|
||||||
idx = find( formatType == type );
|
|
||||||
if isempty(idx)
|
|
||||||
error('Incorrect format');
|
|
||||||
end;
|
|
||||||
|
|
||||||
% Save width
|
|
||||||
if ~isempty(width), width = str2double(width);end;
|
|
||||||
% Save precision
|
|
||||||
if ~isempty(precision), precision = str2double(precision);end;
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
[text, format] = readString(format, [], [' ', '%']);
|
|
||||||
symbol = '*';
|
|
||||||
type = 'r';
|
|
||||||
end
|
|
||||||
|
|
||||||
s(t).type = type;
|
|
||||||
s(t).width = width;
|
|
||||||
s(t).precision = precision;
|
|
||||||
s(t).symbol = symbol;
|
|
||||||
s(t).text = text;
|
|
||||||
|
|
||||||
t = t + 1;
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
R = s;
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
% ------------- Вспомагательные функции --------------------
|
|
||||||
|
|
||||||
function [out, text] = switchType(text, s, argin, fid)
|
|
||||||
|
|
||||||
switch s.type
|
|
||||||
|
|
||||||
case 'd'
|
|
||||||
width = s.width;
|
|
||||||
% Чтение знака числа
|
|
||||||
[sign, text] = getSign(text);
|
|
||||||
if ~isempty(sign), width = width - 1; end;
|
|
||||||
% Чиение числа
|
|
||||||
[word, text] = readNumber(text, width);
|
|
||||||
% Обьеденить знак и число
|
|
||||||
out = [sign word];
|
|
||||||
% Если опция emptyvalue установлена и число пустое то заменить на заданное
|
|
||||||
if ~isempty(out)
|
|
||||||
out = str2double(out);
|
|
||||||
if isequalwithequalnans(out, NaN), error(sprintf('Trouble reading double from file: %s', text)); end;
|
|
||||||
else
|
|
||||||
if ~isempty(text) && isempty(find(text(1) == [13, 10], 1))
|
|
||||||
error(sprintf('Trouble reading integer from file: %s', text));
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
case 'u'
|
|
||||||
if isempty(text) || ~isempty(find(text(1) == [13, 10], 1))
|
|
||||||
out = []; return;
|
|
||||||
end
|
|
||||||
[out, text] = readNumber(text, s.width);
|
|
||||||
% Если опция emptyvalue установлена и число пустое то заменить на заданное
|
|
||||||
if ~isempty(out)
|
|
||||||
out = str2double(out);
|
|
||||||
if isequalwithequalnans(out, NaN), error(sprintf('Trouble reading integer from file: %s', text)); end;
|
|
||||||
else
|
|
||||||
if ~isempty(text) && isempty(find(text(1) == [13, 10], 1))
|
|
||||||
error(sprintf('Trouble reading integer from file: %s', text));
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
case 'f'
|
|
||||||
% Чтение числа
|
|
||||||
[out, text] = readFloat(text, s);
|
|
||||||
% Если опция emptyvalue установлена и число пустое то заменить на заданное
|
|
||||||
if ~isempty(out)
|
|
||||||
out = str2double(out);
|
|
||||||
if isequalwithequalnans(out, NaN), error(sprintf('Trouble reading double from file: %s', text)); end;
|
|
||||||
else
|
|
||||||
if ~isempty(text) && isempty(find(text(1) == [13, 10], 1))
|
|
||||||
error(sprintf('Trouble reading integer from file: %s', text));
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
case 's'
|
|
||||||
[word, text] = readString(text, s.width, argin.delimiter);
|
|
||||||
if isempty(word)
|
|
||||||
out = {''};
|
|
||||||
else
|
|
||||||
out = {word};
|
|
||||||
end
|
|
||||||
|
|
||||||
case 'q'
|
|
||||||
|
|
||||||
case 'c'
|
|
||||||
n = 1;
|
|
||||||
if ~isempty(s.width), n = s.width; end;
|
|
||||||
[word, text] = readCharacters(text, n, fid);
|
|
||||||
out = word(:);
|
|
||||||
|
|
||||||
case 'r'
|
|
||||||
[out, text] = readCharacters(text, length(s.text));
|
|
||||||
if ~isequal(out, s.text), error('Trouble reading characters from file'); end;
|
|
||||||
|
|
||||||
otherwise
|
|
||||||
error('Error');
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
function out = setEmptyValue(text, s, argin)
|
|
||||||
out = text;
|
|
||||||
if isempty(text)
|
|
||||||
if find(['d', 'u', 'f'] == s.type)
|
|
||||||
out = argin.emptyvalue;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function [out, text] = readDoubleArray(text, argin)
|
|
||||||
|
|
||||||
if isempty(text); out = []; return; end;
|
|
||||||
t = 1;
|
|
||||||
while isempty(find(text(1) == [13 10], 1))
|
|
||||||
% Чтение знака
|
|
||||||
[sign, text] = getSign(text);
|
|
||||||
% Чтение числа
|
|
||||||
[word, text] = readFloat(text, []);
|
|
||||||
% Обьеденить знак и число
|
|
||||||
word = [sign word];
|
|
||||||
% Если опция emptyvalue установлена и число пустое то заменить на заданное
|
|
||||||
if ~isempty(argin.emptyvalue) && isempty(word)
|
|
||||||
out(t) = argin.emptyvalue;
|
|
||||||
else
|
|
||||||
out(t) = str2double(word);
|
|
||||||
if isequalwithequalnans(out(t), NaN), error('Trouble reading integer from file'); end;
|
|
||||||
end
|
|
||||||
|
|
||||||
% Убрать первый символ если он равен delimiter
|
|
||||||
if ~isempty(argin.delimiter) && ~isempty(text)
|
|
||||||
if find(argin.delimiter == text(1))
|
|
||||||
text = text(2:end);
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
|
|
||||||
t = t + 1;
|
|
||||||
if isempty(text); break; end;
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue