• Nenhum resultado encontrado

2.8 Problemas encontrados em linguagens de programação

3.1.18 Input e output para ficheiros

Em termos de input e output de ficheiros, existem dois tipos de operações que o aluno pode fazer, um é o modo de texto para ficheiro e outro é o modo de estruturas.

Para trabalhar com ficheiros, o aluno dispõe de várias funções predefinidas na linguagem Temple, que traba- lham com o tipo primitivofile.

Para inicializar ou afetar uma variável do tipofile, o aluno dispõe de duas funções, a função open e a função create. A função open abre um ficheiro que já exista numa dada localização, caso exista, senão cria o ficheiro nessa localização. No caso do ficheiro ser aberto, este mantém a informação que existia anteriormente no fi- cheiro, podendo acrescentar ou alterar a informação posteriormente. No caso do ficheiro ser criado, este é criado sem qualquer informação. A funçãocreate cria um ficheiro numa dada localização, independente- mente de já existir um ficheiro nessa localização ou não. Caso já exista um ficheiro nessa localização, este é apagado e substituído por um novo ficheiro vazio, com o mesmo nome.

Em ambos os tipos de abertura de ficheiros, o aluno começa a trabalhar do início do ficheiro, necessitando de alterar a posição caso pretenda trabalhar noutra posição do ficheiro.

Em termos de sintaxe, ambas as funções funcionam de modo idêntico, sendo ambas uma função com três argumentos, uma string com a localização do ficheiro, uma string com a operação que se pretende fazer com o ficheiro (de escrita, leitura ou ambas) e uma string com o tipo de abertura que se faz (se é uma abertura para ficheiros de texto ou de estruturas). Para os tipos de leitura, foi decidido incluir as strings: "read" para fazer apenas leitura,"write" para fazer apenas escrita e "readwrite" para fazer leitura e escrita. Para os tipos de abertura, foi decidido incluir as strings: "text" para trabalhar com texto e "binary" para trabalhar com ficheiros que contêm apenas um tipo de estrutura. O tipo de estrutura é gerido pelo aluno, que pode utilizar o tipo de estrutura que pretender com o ficheiro (com tipos definidos pelo aluno inclusive).

Exemplo de abertura e criação de ficheiros:

1 file novo_ficheiro;

2 novo_ficheiro = open("../pasta/ficheiro1", "readwrite", "text"); 3

4 file novo_ficheiro2 = create("../pasta/ficheiro2", "read", "binary");

o ficheiro do tipofile e uma sequência de expressões entre vírgulas.

Para fazer input o aluno utiliza um procedimento chamadoread. Este procedimento tem como argumentos o ficheiro do tipofile e uma sequência de variáveis entre vírgulas.

Existe ainda outro procedimento para input que éreadline. Este procedimento funciona de modo idêntico ao procedimentoread, mas este procedimento lê uma frase do ficheiro como uma string de texto até encontrar o carácter\n que representa o fim de linha. O carácter é consumido (apesar de não ser guardado na variável), de modo a que a leitura seguinte comece após o carácter\n.

Para fechar o ficheiro, o utilizador utiliza o procedimentoclose com a variável do ficheiro como argumento. Exemplo de input e output de ficheiros:

1 novo_ficheiro3 = open("../pasta/ficheiro3", "readwrite", "text"); 2

3 write(novo_ficheiro3 , “Uma história para se contar.\n"); 4 # procedimento que escreve no ficheiro

5

6 string abc;

7 read(novo_ficheiro3 , abc);

8 # procedimento que lê uma palavra apenas para a variável abc 9

10 string def;

11 readline(novo_ficheiro3 , def);

12 # procedimento que lê uma frase para a variável def

Existem ainda algumas ideias que não ficaram bem definidas para outras funções ou procedimentos para o aluno utilizar com ficheiros. Um desses procedimentos é o procedimentogoto que tem dois argumentos, o ficheiro do tipofile e uma expressão do tipo string. A ideia por detrás deste procedimento é o aluno poder ir para o início do ficheiro ou para o fim, com os comandos"begin" e "end".

Outro procedimento pensado foi o procedimentoseek que tem dois argumentos, o ficheiro do tipo file e uma expressão do tipoint. A ideia é permitir o aluno andar uma quantidade (indicada por um valor inteiro no segundo argumento) que pretende avançar ou recuar a partir da posição atual. Este procedimento seria utilizado em modo de estruturas.

Ainda foram pensadas algumas funções, tais comoeof e eoline, com um argumento que é o ficheiro do tipo file. Estas funções retornariam um valor booleano true quando, na leitura de um ficheiro (eof para ambos os tipos de abertura, eeoline apenas para ficheiros de texto) se chegasse ao fim do ficheiro ou ao fim de uma linha, respetivamente.

Por fim, uma função que ficou mais em aberto é a funçãoerror, que tem apenas um argumento que é o ficheiro do tipofile. A ideia seria retornar um valor inteiro correspondente a um tipo de erro (ou junção de erros) que possa ocorrer no trabalho com ficheiros (problemas de acesso a ficheiro, abertura, escrita ou leitura, entre outros). Esta função e as anteriores ficaram para trabalho futuro, necessitando de mais ajustes e/ou trabalho junto de alunos para ver quais os melhores passos a dar.

Exemplos possíveis para estas funções:

1 novo_ficheiro4 = open("../pasta/ficheiro4", "readwrite", "text"); 2 3 goto(novo_ficheiro4 , "begin"); 4 string abc; 5 while !eoline(novo_ficheiro4) do 6 read(novo_ficheiro4 , abc); 7 output(abc, "\n"); 8 endwhile 9

10 #(o aluno abre um ficheiro de texto e vai para o início do ficheiro 11 enquanto não chegar ao fim de uma linha , lê string a string

12 para a variável abc e imprime por linha cada palavra para o ecrã #) 13

14

15 novo_ficheiro5 = open("../pasta/ficheiro5", "readwrite", "binary"); 16 17 goto(novo_ficheiro5 , "end"); 18 if eof(novo_ficheiro5) then 19 write(novo_ficheiro5 , 10); 20 seek(novo_ficheiro5 , -1); 21 endif 22

23 #(o aluno abre um ficheiro binário de inteiros e vai para 24 o fim do ficheiro. Se estiver no fim do ficheiro (que está), 25 escreve o valor 10 no ficheiro e move o apontador de escrita 26 para a posição onde escreveu o valor 10, ou seja ,

27 escreveu um valor numa posição X,

28 o apontador moveu para a posição X+1, e com o procedimento seek , 29 o apontador voltou para a posição anterior , X #)

30

31 int x = error(novo_ficheiro5); 32

33 #(variável x fica com um valor inteiro que corresponde 34 a um determinado erro conforme uma lista de erros 35 que possa ser definida posteriormente #)

De notar que uma possível lista com os erros não foi definida e fica como uma possibilidade de trabalho futuro.

Documentos relacionados