如何修复错误:“A(I):索引超出范围;值1超出范围0”

时间:2016-06-03 19:02:13

标签: matlab octave

所以我做了这个功能,但我不知道为什么我会收到这个错误。我该如何解决?

  

错误: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

2 个答案:

答案 0 :(得分:3)

当然,您正在尝试访问空数组中的值(其中没有值)。

发生这种情况的原因是您在第一个while循环内部读取整个文件,该文件将文件指针放在文件的末尾。然后(不重置文件指针),尝试在for循环中逐行读取它。由于文件指针已经在文件的末尾,fgetl将始终返回一个空数组([]),因此当您开始尝试使用它时,您会收到索引错误所示。

解决方案是两个选项之一:

  1. frewind(ficheiro)循环之前调用for,将文件指针重置为文件的开头,以便您可以成功读取每一行。

  2. 提出一种更好的解析文件的方法,而不是循环遍历整个文件,仅用于计算文件中的行数。

  3. 如果您发布了一些文件内容,我们可能会为您提供一种更好的方法来解析一行或两行代码中的文件。

    <强>更新

    另外,如果你看一下这一行,n一直到pontovirgula的末尾。

    for n = 1:2:length(pontovirgula)
    

    但是,您尝试访问12 过去数组的结尾

    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的值。