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:
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
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.