所以我做了这个功能,但我不知道为什么我会收到这个错误。我该如何解决?
错误:LOADC:A(I):索引越界;值1超出界限0
错误:来自 LOADC第15行第13栏
function res=LOADC(url)
[nomeFicheiro,sucesso]= urlwrite(url,'Composicoes.txt');
ficheiro=fopen(nomeFicheiro,'r');
fgetl(ficheiro);
nLinhas=0;
while (fgets(ficheiro) ~= -1)
nLinhas = nLinhas+1;
end
for i=2:nLinhas
linha=fgetl(ficheiro);
pontovirgula=findstr(linha,';');
Material=linha(1:pontovirgula(1)-1);
for n=1:2:length(pontovirgula)
ElemX=linha(pontovirgula(n)+1:pontovirgula(n+1)-1);
PercentX=linha(pontovirgula(n+1)+1:pontovirgula(n+2)-1);
end
end
fclose(ficheiro);
res=Composicoes;
end
答案 0 :(得分:3)
当然,您正在尝试访问空数组中的值(其中没有值)。
发生这种情况的原因是您在第一个while
循环内部读取整个文件,该文件将文件指针放在文件的末尾。然后(不重置文件指针),尝试在for
循环中逐行读取它。由于文件指针已经在文件的末尾,fgetl
将始终返回一个空数组([]
),因此当您开始尝试使用它时,您会收到索引错误所示。
解决方案是两个选项之一:
在frewind(ficheiro)
循环之前调用for
,将文件指针重置为文件的开头,以便您可以成功读取每一行。
提出一种更好的解析文件的方法,而不是循环遍历整个文件,仅用于计算文件中的行数。
如果您发布了一些文件内容,我们可能会为您提供一种更好的方法来解析一行或两行代码中的文件。
<强>更新强>
另外,如果你看一下这一行,n
一直到pontovirgula
的末尾。
for n = 1:2:length(pontovirgula)
但是,您尝试访问1
和2
过去数组的结尾
pontovirgula(n+1)
pontovirgula(n+2)
这肯定会引起问题。尝试仅从最后循环到2。
for n = 1:2:(numel(pontovirgula) - 2)
更新2
鉴于您已发布文件内容,以下是解析文件的另一种方法。
fid = fopen('filename.txt', 'rt');
lines = textscan(fid, '%s', 'HeaderLines', 1);
fclose(fid);
% For each line we want to get the reference off of the front
parts = regexp(lines{1}, ';', 'split');
materials = cell(1, numel(parts));
elements = cell(1, numel(parts));
percentages = cell(1, numel(parts));
for k = 1:numel(parts)
% Remove the last empty blank
parts{k}(end) = [];
% Get the material (the first element)
materials{k} = parts{k}{1};
% Get the elements
elements{k} = parts{k}(2:2:end);
% Get the percents
percents{k} = parts{k}(3:2:end);
end
答案 1 :(得分:0)
检查linha的长度,以及用于索引linha的pontovirgula的值。