Lendo e Escrevendo em arquivos

Iniciado por adalberto, Maio 23, 2015, 12:45:03 PM

tópico anterior - próximo tópico

adalberto

Veja que é muito simples abrir, ler ou escrever em um arquivo.

Vamos usar a  biblioteca padrão de entrada e saída 'es'.

Primeiro a leitura linha a linha (troque o nome do arquivo por um de seu computador);
PS.: corrigido o código abaixo 05/07/2017 (havia um erro de variável)

local matriz = { };
local cont = 0;
arquivo = es.abra( "caminho_nome_arquivo.extensao" , "leitura" ); //abre em modo leitura

   enquanto verdadeiro inicio //laco enquanto infinito
        cont = cont + 1;
        matriz[cont] = arquivo:leia();
       se matriz[cont] == nulo entao quebre fim //interrompe o laco enquanto           
   fim //fim enquanto

arquivo:feche() ; //nao esqueca de fechar o objeto aberto, ok.

   para i = 1 , #matriz inicio //para i igual a 1 repita até o tamanho da matriz
       imprima ( matriz[i] );
   fim //fim para


Se você quiser ler todo o arquivo em uma única variável basta fazer o seguinte:


    arq  =  es.abra("nome_arquivo.ext" , "leitura" );  //criando um objeto de leitura.
           conteudo_total = arq:leia("*t" ); //coloque entre aspas um asterisco e um t  "*t" , e o arquivo será lido inteiro.
    arq:feche() ; //nunca esqueça de fechar o objeto aberto;

   imprima(  conteudo_total );
       

     

Caso haja problemas ao abrir o arquivo o retorno será nulo, e o procedimento posterior gerará um erro.
Neste caso é bom nos precavermos vendo se a abertura ocorreu com sucesso testando a variável:


  local arq, err = es.abra("nome_arquivo.ext" , "leitura");

     se arq <> nulo entao     //testando se arq for diferente de nulo entao leia o arquivo:
                     conteudo_total = arq:leia("*t");
                     arq:feche();
    senao
              imprima("Erro:", err);
    fim  //fim se arq <> ...

    se conteudo_total <> nulo entao imprima( conteudo_total) fim;
   



----------------------------------------------                ESCREVENDO EM UM ARQUIVO   -------------------------------------------------------

Para escrever basta mudar o modo de abertura ( "leitura" para "escrita" );



  local  arq, err = es.abra( "nome_arquivo.ext" , "escrita" );
         
   se arq <> nulo entao
                 arq:escreva( "Oi esta é a primeira Linha" );
                 arq:escreva( "\npulando uma linha\n") ; //necessário usar o ecape \n  para ir em outra linha;
                 arq:escreva("\n\n\nÚltima linha" );
                 arq:feche(); //nao esqueça de fechar o objeto aberto.
   senao
              imprima("Erro:", err);  //caso arq seja nulo este comando será executado.
   fim




Após a escrita vá onde salvou o arquivo e o abra em um editor para ver se deu certo.
Veja que a cada chamada de arq:escreva()  um trecho é acrescentado, mas não em cada linha, isso fica a cargo do
programador usar o \n para indicar nova linha.


OBS.: Ao usar o modo "escrita"  o arquivo original se já existir será sobrescrito, então muito cuidado ao usá-lo.


Mas e se o objetivo for adicionar conteúdo no arquivo sem apagar o que já está lá.
Bom é possível ler guardar o conteúdo em uma variável, concatenar e escrever.
Porém existe um jeito mais fácil, caso o que ser quer é adicionar ao final do arquivo, veja:

-------------------------------------------    ADICIONANDO CONTEÚDO SEM SOBRESCREVER O ARQUIVO --------------


//abra o arquivo em modo "adicao":

local arq, err = es.abra( "nome_arquivo.ext" , "adicao" );
     
      se arq <> nulo entao
                  arq:escreva("\n\nOla mais uma linha adicionada");
          arq:feche(); //fechando o objeto
     senao
                  imprima("Erro:", err);
     fim  //fim se




Caso o arquivo exista será anexado o conteúdo sem apagar o que já está lá,
se não existir o arquivo será criado e escrito normalmente o conteúdo.


-------------------------------------------  Leitura  e  escrita  binária ------------------------------------------------

A leitura e escrita binaria é feita da mesma forma que os modos normais. Apenas troque para "leiturabin"    e   "escritabin"


Leitura:


  local arq, err = es.abra("nome_arquivo.ext" , "leiturabin");

     se arq <> nulo entao     //testando se arq for diferente de nulo entao leia o arquivo:
                     conteudo_total = arq:leia("*t");
                     arq:feche();
    senao
               imprima("Erro:", err);
    fim  //fim se arq <> ...

    se conteudo_total <> nulo entao imprima( conteudo_total) fim;
   


Escrita:



   local arq, err = es.abra( "nome_arquivo.ext" , "escritabin" );
         
   se arq <> nulo entao
                 arq:escreva( "Oi esta é a primeira Linha" );
                 arq:escreva( "\npulando uma linha\n") ; //necessário usar o ecape \n  para ir em outra linha;
                 arq:escreva("\n\n\nÚltima linha" );
                 arq:feche(); //nao esqueça de fechar o objeto aberto.
   senao
                imprima("Erro:", err);  //caso arq seja nulo este comando será executado.
   fim




A escrita binária é boa para escrever o resultado de uma string.compile ( ) (veja no manual básico biblioteca string)

OBS.: Fluxo Binário

Um fluxo binário é composto por uma seqüência de bytes lidos, sem tradução, diretamente do dispositivo externo. Não ocorre nenhuma tradução e existe uma correspondência um para um entre os dados do dispositivo e os que estão no fluxo.


Bom é isso aí pessoal, já sabem o básico para leitura e escrita de arquivos, ok.
Qualquer dúvida deixem nos comentários:





rafael

Só corrigindo a leitura linha a linha:


#!/usr/local/bin/prisma


matriz = { };
cont = 0;
arquivo = es.abra( "/sys/class/net/rede4/statistics/rx_bytes" , "leitura" ); //abre em modo leitura

   enquanto verdadeiro inicio //laco enquanto infinito
        cont = cont + 1;
        matriz[cont] = arquivo:leia();
       se matriz[cont] == nulo entao quebre fim //interrompe o laco enquanto           
   fim //fim enquanto

arquivo:feche() ; //nao esqueca de fechar o objeto aberto, ok.

   para i = 1 , #matriz inicio //para i igual a 1 repita até o tamanho da matriz
       imprima ( matriz[i] );
   fim //fim para

adalberto

Blz, nem havia me dado conta.

Na época não me lembrei que para a função es.abra() há dois retornos: o arquivo e o erro:

local a, err = es.abra('nome.ext', 'leiturabin');
se nao a entao
  imprima(err);
  sis.saia(1);
fim
...


Obs.: se definir o local para pt_BR.utf8 a mensagem de erro fica em português.