Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
Informática para Ciências e Engenharias
2014/15
Teórica 8
2
Na aula de hoje...
Organização de um disco.• Sistema de ficheiros.
• Ficheiros de texto e binários.
Operações sobre ficheiros de texto.
3
Ficheiros
4
Ficheiros
Ficheiro:• espaço de endereçamento logicamente
contíguo acessível através de um identificador único (nome).
• contém uma sequência de bytes que pode ser interpretada como dados (texto, imagem, som, etc.) ou programas.
5
Ficheiros
Ficheiro:• é persistente, geralmente guardado no disco
rígido, cartão de memória, etc.
Disco:• O SO encarrega-se de gerir os ficheiros e os
discos em que estes residem. A organização do disco é escondida aos programadores e utilizadores.
6
Disco
Um disco contém várias superfícies (platters).
7
Disco
Uma superfície contém pistas (tracks) concêntricas e divide-se em sectores, que também dividem a pista. Os dados na pista são organizados em blocos.
8
Disco
Tempo de Acesso
• Tempo de “seek”: tempo requerido para atingir a pista desejada – 8 a 20 milissegundos
9
Disco
Tempo de Acesso
• Latência de rotação: tempo necessário para que o disco rode até ao sector pretendido – 2 a 5 milissegundos
10
Disco
Tempo de Acesso
• Tempo de transferência: tempo para transferir do disco para a memória – muito mais pequeno do que os tempos anteriores.
11
Disco
Escrita num ficheiro
• A informação é transferida da RAM para o disco.
12
Disco
Escrita num ficheiro
• Os dados ficam fragmentados no disco mas o SO apresenta-os como contíguos (o ficheiro)
• (desfragmentar)
13
Tipos de ficheiro
Todos os ficheiros contêm bytes• Cada byte é um número de 0 a 255, em
binário (conjunto de bits)
• Qualquer ficheiro só contém bytes.
Mas, conceptualmente, categorizamos os ficheiros de acordo com a interpretação que fazemos dos valores.
14
Tipos de ficheiro
Ficheiros de texto• Os bytes são interpretados como caracteres
imprimíveis: letras maiúsculas e minúsculas, algarismos e sinais de pontuação.
A codificação usada é a ASCII ou uma derivada desta.• Essencialmente, um ficheiro de texto é um
ficheiro codificado com esta convenção.
15
Tipos de ficheiro
Ficheiros binários• A interpretação do seu conteúdo está a cargo
do programa que o utiliza; pode conter bytes que não correspondem a caracteres imprimíveis.
• Podem ser dados (inteiros, reais), programas (códigos máquina de um dado CPU), sons (segundo uma codificação como o MP3), imagens (codificadas num formato como o JPEG), filmes (MPEG, por exemplo), etc.
16
Tipos de ficheiro
Exemplo: ficheiro de texto (compara.m)
function igual=compara(s1,s2)% igual=compara(s1,s2)% devolve true se as strings forem iguais a menos% de posicoes marcadas com ? if length(s1)==length(s2) pos = 1; while (pos<=length(s1)) && …...
17
Tipos de ficheiro
Exemplo: ficheiro de texto (compara.m)
18
Tipos de ficheiro
Exemplo: ficheiro de texto (compara.m)
f u n c t i o n i g u a l = c
19
Tipos de ficheiro
Exemplo: ficheiro de texto (compara.m)
Mudança de linha (carriage return, line feed)
20
Tipos de ficheiro
Exemplo: ficheiro binário (wav)
21
Tipos de ficheiro
Exemplo: ficheiro binário (wav)
22
Sistema de ficheiros
O sistema de ficheiros está organizado hierarquicamente em árvore (“invertida”).• Raiz (a directoria do topo)
• C:\ (Windows)
• Ramos (as outras directorias).• Cada directoria pode conter ficheiros e outras
(sub-) directorias.
• Folhas (ficheiros).
• Nesta árvore, a pesquisa de um ficheiro é eficiente.
23
Sistema de ficheiros
Raiz• C:\
• Programas
• Matlab
• Office
• word.exe
• Users
• Luis
• ICE
• ...
24
Sistema de ficheiros
O separador (\ em Windows) indica que a subdirectoria ou ficheiro está localizados numa directoria.
O caminho para o ficheiro (pathname) pode ser:• Absoluto: completo a partir da raiz
• C:\users\am.fonseca\ICE\ahetal.m
• Relativo: a partir da directoria corrente.• ICE\ahetal.m ..\jp.meireles\ICE\papel.m
25
Sistema de ficheiros
Notações especiais (que podem ser usadas nos caminhos):• . (ponto) representa a directoria corrente;
• .. (dois pontos) representa a directoria pai da directoria corrente.
O comando cd <nomeDaDirectoria> muda a directoria corrente.
26
Acesso ao ficheiro
Para ler ou escrever num ficheiro é preciso “abrir” o ficheiro• Ou seja, pedir ao sistema operativo que nos
dê acesso ao ficheiro.
No final é preciso “fechar” o ficheiro• Ou seja, notificar o sistema operativo de que
já não estamos a usar o ficheiro• Para este escrever os dados (cache)
• Para permitir o acesso a outras aplicações
27
Acesso ao ficheiro
O acesso ao ficheiro é sequencial• À medida que se lê ou escreve avança-se no
ficheiroPosição corrente
•Leitura de nelems de tamanho T•Ao deslocamento corrente é somado nelems*T.
Início Fim
•Posição corrente após a leitura
28
Acesso ao ficheiro
Em MATLAB• Função fopen pede acesso ao ficheiro (ao sistema
operativo) e devolve um identificador que depois usamos para aceder ao ficheiro• 'r' para leitura
• 'w' para escrita
• Em caso de erro devolve -1, um número positivo se tudo correr bem.
fich = fopen( nomeFicheiro, 'r' )
fich = fopen( nomeFicheiro, 'w' )
29
Acesso ao ficheiro
Em MATLAB• Função fclose fecha o ficheiro notificando o
sistema operativo para que o liberte
• Em caso de erro devolve -1, 0 se tudo correr bem
res = fclose(fich)
fclose(fich) % se não é preciso res
30
Acesso ao ficheiro
Escrever no ficheiro, em MATLAB• fprintf escrever uma string inserindo e formatando
valores adicionais onde indicado por %• %i inteiro, decimal
• %f fraccionário
• %.2f fracionário com 2 casas decimais
• %% sinal de percentagem
• \n mudança de linha (também \t para tab)
• Nota: omitindo o identificador fich, escreve na consola
fprintf(fich,'Demorou %i horas',12)
Grava ficheiro
31
Acesso ao ficheiro
Ler do ficheiro, em MATLAB• Função fgetl permite ler uma linha do ficheiro. Ou
seja, um conjunto de bytes, que devolve numa string, até encontrar os caracteres de mudança de linha. Devolve -1 se passa o fim do ficheiro.
• Função feof devolve true se já chegámos ao fim do ficheiro, false caso contrário.
linha = fgetl(fich)
Ler ficheiro
feof(fich)
32
Exemplo 1: calcular pauta
33
Calcular pauta
Queremos obter no ficheiro pauta.txt a pauta da avaliação contínua de ICE
A nota final de um aluno é:• um inteiro entre 10 e 20, se aprovado;
• ‘Admitido’ se reprovou pode vir a exame;
• ‘Excluído’ se está definitivamente reprovado.
34
Calcular pauta
Temos as notas dos trabalhos (TP1 e TP2) e dos testes (T1 e T2) numa folha de cálculo
• Mas tem um formato binário
35
Calcular pauta
Copiamos para um editor de texto simples e gravamos como texto.
• notas.txt Ou gravamos a folha
de cálculo como texto, separando as colunas por vírgulas, tabs ou espaços
36
Calcular pauta
Agora precisamos de• Ler o ficheiro
• Calcular a pauta da avaliação
• Gravar noutro ficheiro• pauta.txt
37
Calcular pauta
Já temos funções para calcular a pautafunction pauta = calculapauta(notas)
• recebe a matriz com as notas e devolve a pauta com o número na primeira coluna e a nota na segunda
function nota = calculanota(notas)
• devolve -1 se não obteve frequência, CompTP arredondada se não teve nota mínima nesta, ou a média ponderada de CompTP e CompL arredondada.
function res=arredonda(valor,casasDec)
38
Calcular pauta
Precisamos de• Ler o ficheiro para uma matriz com
• Número, TP1,TP2, T1, T2
• Usar a função calculapauta
• Gravar a matriz calculada no ficheiro• pautafinal.txt
39
Calcular pauta
Precisamos de• Ler o ficheiro para uma matriz com as notas
function notas = lenotas(nomeFich)
• Gravar a matriz calculada no ficheirofunction gravapauta(pauta,nomeFich)
• Juntar tudofunction gerapauta(nomeNotas,nomePauta)
40
Calcular pauta
41
Calcular pauta
Abre o ficheiro para leitura e guarda o identificador, necessário para as outras funções.
42
Calcular pauta
A primeira linha (o cabeçalho “Número TP1”, etc) não interessa. Mas temos de a ler para avançar a posição no ficheiro.
43
Calcular pauta
Enquanto não chegamos ao fim do ficheiro, lemos uma linha, convertemos em vector numérico e acrescentamos como uma nova linha na matriz.(Matriz inicialmente vazia)
44
Calcular pauta
Normalmente, dimensionamos à partida vectores e matrizes com o espaço necessário.No entanto, neste caso só poderíamos fazer isso percorrendo o ficheiro duas vezes, o que é ainda pior do que obrigar a redimensionar a matriz.
45
Calcular pauta
É importante fechar o acesso ao ficheiro para o sistema operativo permitir que outros processos acedam ao ficheiro.
46
Calcular pauta
Testar a leituras das notas
octave:21> lenotas('notas.txt')ans =
6.0133e+04 3.3000e+00 1.6000e+00 7.4000e+00 7.0000e+00 6.0136e+04 4.9000e+00 0.0000e+00 0.0000e+00 1.0400e+01 6.0137e+04 1.1300e+01 1.4900e+01 1.4800e+01 3.9000e+00 6.0145e+04 6.3000e+00 1.6400e+01 1.6300e+01 6.8000e+00 6.0148e+04 8.0000e+00 1.1700e+01 1.7000e+01 5.9000e+00 6.0157e+04 8.4000e+00 2.1000e+00 1.6600e+01 4.6000e+00 6.0161e+04 0.0000e+00 1.2400e+01 1.0600e+01 5.4000e+00 6.0166e+04 1.5300e+01 7.6000e+00 1.8000e+01 1.4300e+01 ...
47
Calcular pauta
Testar a leituras das notas (format bank)
octave:21> lenotas('notas.txt')ans =
60133.00 3.30 1.60 7.40 7.00 60136.00 4.90 0.00 0.00 10.40 60137.00 11.30 14.90 14.80 3.90 60145.00 6.30 16.40 16.30 6.80 60148.00 8.00 11.70 17.00 5.90 60157.00 8.40 2.10 16.60 4.60 60161.00 0.00 12.40 10.60 5.40 60166.00 15.30 7.60 18.00 14.30 ...
48
Calcular pauta
Abre o ficheiro para escrita e escreve o cabeçalho. \t é um tabulador, \n para mudar de linha
49
Calcular pauta
Para cada linha da pauta escreve o número, um tab, e o valor (inteiro) da nota ou o texto.
50
Calcular pauta
No caso da escrita fechar o ficheiro não só liberta o ficheiro mas leva o sistema operativo a escrever os dados que tenham ficado retidos em cache
51
Calcular pauta
testaroctave:8> pauta=[1,-1;2,9;3,14]pauta =
1 -1 2 9 3 14
octave:9> gravapauta(pauta,'testepauta.txt')
Aluno Nota1 Excluído2 Admitido3 14
(testepauta.txt)
52
Calcular pauta
53
Calcular pauta
testar octave:9> gerapauta('notas.txt','pauta.txt')
Número TP1 TP2 T1 T260133 3.3 1.6 7.4 760136 4.9 0 0 10.460137 11.3 14.9 14.8 3.960145 6.3 16.4 16.3 6.860148 8 11.7 17 5.960157 8.4 2.1 16.6 4.660161 0 12.4 10.6 5.460166 15.3 7.6 18 14.360175 12.1 10 0 6.160182 7.2 5.2 0.6 6.260184 8.5 18.8 11 060190 12.6 9.4 4.3 10.1...
Aluno Nota60133 Excluído60136 Excluído60137 Admitido60145 1160148 1060157 Excluído60161 Admitido60166 1460175 Admitido60182 Excluído60184 Admitido60190 Admitido
...
54
Exemplo 2: variante, listagem
55
Criar pauta
Mesmo problema de criar a pauta, mas a partir de uma listagem dos alunos e trabalhos:• número
• [TP1:]
• [TP2:]
• [T1:]
• [T2:]
• Os elementos em falta são 0
60133TP1:3.3TP2:1.6T1:7.4T2:7.060136TP1:4.9T2:10.460137TP1:11.3TP2:14.9T1:14.8T2:3.960145TP1:6.3TP2:16.4T1:16.3T2:6.8...
56
Criar pauta
O problema é o mesmo, à parte de uma função:
• em vez de:
• e substituir a função que junta tudofunction geradalista(nomeNotas,nomePauta)
function notas = lenotas(nomeFich)
function notas = lelistanotas(nomeFich)
57
Criar pauta
Algoritmo para ler a lista de elementos de avaliação:• A matriz notas começa vazia
• Enquanto não termina o ficheiro• Se a linha contém TP1:, TP2:, etc, converter
número e copiar para a posição respectiva da última linha da matriz
• Caso contrário copiar o número para a primeira coluna de uma linha nova na matriz, com os restantes a 0.
58
Criar pauta
Se a linha contém TP1:, TP2:, etc,• usar findstr
• verificar se o resultado não é um vector vazio• length( … )~=0 ou
• ~isempty( … )
59
Calcular pauta
60
Calcular pauta
Se a linha tem algum destes elementos, é preciso copiar o valor para a célula certa
61
Calcular pauta
Caso contrário é preciso criar uma linha nova com o número e 0 nos elementos de avaliação.
62
Calcular pauta
testar60133TP1:3TP2:1T1:7T2:760136TP1:4T2:1060137TP1:11TP2:14T1:14T2:360145TP1:6TP2:16T1:16T2:6...
octave:11> lelistanotas('listagem.txt')ans =
60133.00 3.30 1.60 7.40 7.00 60136.00 4.90 0.00 0.00 10.40 60137.00 11.30 14.90 14.80 3.90 60145.00 6.30 16.40 16.30 6.80 60148.00 8.00 11.70 17.00 5.90 60157.00 8.40 2.10 16.60 4.60 60161.00 0.00 12.40 10.60 5.40 60166.00 15.30 7.60 18.00 14.30 60175.00 12.10 10.00 0.00 6.10 60182.00 7.20 5.20 0.60 6.20 60184.00 8.50 18.80 11.00 0.00
...
63
Calcular pauta
64
Calcular pauta
testar geradalista('listagem.txt','pautalista.txt')
Aluno Nota60133 Excluído60136 Excluído60137 Admitido60145 1160148 1060157 Excluído60161 Admitido60166 1460175 Admitido60182 Excluído60184 Admitido60190 Admitido...
60133TP1:3.3TP2:1.6T1:7.4T2:7.060136TP1:4.9T2:10.460137TP1:11.3TP2:14.9T1:14.8T2:3.960145TP1:6.3TP2:16.4T1:16.3T2:6.8...
65
Para estudar a aula de hoje
Manual do Octave• Capítulo 14
• Tem várias funções que podem ser úteis
• (ou confusas)
• Estas secções focam particularmente o que demos aqui:
• 14.2.1 Opening and Closing Files
• 14.2.3 Line-Oriented Input
• 14.2.4 Formatted Output
66
Dúvidas