Percorrendo as linhas de um arquivo de maneira bem fácil

Iniciado por adalberto, Março 09, 2017, 08:45:11 AM

tópico anterior - próximo tópico

adalberto

Existe uma função iteradora, ou seja, uma função que pode ser usada repetidamente para percorrer dados em sequência, neste caso um arquivo.

Podemos usa funções iteradoras com o comando "para" em modo especial. Veja o código abaixo:


local dir = inclua'igdir'
//primeiro testo se o arquivo existe:
se dir.arquivo_existe("arquivo.ext") entao
  //vamos iniciar o laço para percorrendo todas as linhas do arquivo
  para lin em es.linhas("arquivo.ext") inicio
    imprima( lin ); //imprime cada linha lida;
  fim 
senao
  imprima"arquivo não existe ou não tem acesso!";
fim


Perceba que é muito simples usar a função es.linhas() com o comando 'para', note que eu apenas imprimi cada linha
percorrida do arquivo, mas é possível fazer o que quiser com a linha lida, depende do propósito do programador.
Note, também, que não é necessário fechar o arquivo no final, pois a própria função iteradora cuida disso.

Usando o es.linhas() com o comando enquanto:


local dir = inclua'igdir'
se dir.arquivo_existe("arquivo.txt") entao
  local arq_leia = es.linhas("arquivo.txt");  //retornando a função iteradora.
  enquanto 1 inicio
    lin = arq_leia();
    se lin entao
      imprima(lin);
    senao
      quebre;
    fim
  fim //fim enquanto
fim //fim se dir.arquivo_existe();



Outras formas de percorrer as linhas de um arquivo:


local a, erro_msg = es.abra("arquivo.txt", "leitura");
se a entao
  loca lin = ''; //crio a variável com string vazia;
  enquanto 1 inicio //um sempre será um então o laço é infinito,
                                  //devendo ser quebrado por dentro com o comando quebre.
    lin = a:leia(); //a cada repetição lê uma linha do arquivo;
   se lin entao
     imprima(lin);
   senao  //quando chegar ao fim lin será nulo então o laço é quebrado
      quebre;
   fim
  fim //fim enquanto
  a:feche(); //fechando o arquivo, nunca se esqueça disso!
senao
  imprima("Erro:", erro_msg); //caso o arquivo não seja aberto, o primeiro retorno é nulo e o segundo uma mensagem.
fim


E se ao invés de ler linha por linha você quiser ler um bloco definido de bytes. Use o código abaixo:

local a, msg_erro = es.abra("arquivo.txt", "leitura");

se a entao
  enquanto 1 inicio
    bloco = a:leia( 7000 ); //lê 7000 bytes por vêz, ou até o final do arquivo se ele for menor que 7000;
    se bloco entao
       imprima(bloco);
    senao
       quebre;
    fim
  fim //fim enquanto
senao
  imprima("Erro:", msg_erro); //caso haja erro ao tentar abrir o arquivo.
fim

Eu já fiz um tutorial sobre lêr aquivos que abrange outros detalhes, como leitura binária que pode ser usada para
copiar arquivo de fotos, vídeos etc. Dê uma olhadinha neste link:

http://linguagemprisma.br4.biz/prisma_forum/index.php?topic=13.0

É isso, até mais.

Encontrou algum erro? Alguma dúvida? Sinta-se a vontade em perguntar.