Upload
vannga
View
216
Download
0
Embed Size (px)
Citation preview
Na aula de hoje
l Organização de um disco.
• Sistema de ficheiros.
• Ficheiros de texto e binários.
l Operações sobre ficheiros de texto.
Ficheiros
l Organização de um disco. • Sistema de ficheiros.
l 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: (texto, binário).
Ficheiros
l Ficheiro: • é persistente, geralmente guardado no disco rígido, cartão
de memória, etc.
l 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.
Disco
l Disco: • contém várias superfícies (platters). • 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.
Disco
l Tempo de Acesso • Tempo de “seek”: tempo
requerido para atingir a pista desejada • Tipicamente entre 8 e
20 milissegundos
Disco
l Tempo de Acesso • Latência de rotação:
tempo necessário para que o disco rode até ao sector pretendido • Tipicamente entre 2 e
5 milissegundos
Disco
l Tempo de Acesso • Tempo de transferência:
tempo para transferir do disco para a memória – • muito mais pequeno
do que os tempos anteriores.
Ficheiros e Discos
l Escrita num ficheiro • Os dados ficam fragmentados
no disco mas o SO apresenta-os como contíguos (o ficheiro)
• (desfragmentar)
Tipos de Ficheiros
l 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.
l Mas, conceptualmente, categorizamos os ficheiros de acordo com a interpretação que fazemos dos valores.
Tipos de Ficheiros
l Ficheiros de texto • Os bytes são interpretados como caracteres imprimíveis:
letras maiúsculas e minúsculas, algarismos e sinais de pontuação.
l A codificação usada é a ASCII ou uma derivada desta. • Essencialmente, um ficheiro de texto é um ficheiro
codificado com esta convenção.
Tipos de Ficheiros
l 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.
Tipos de Ficheiros
l 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)) && … ...
Tipos de Ficheiros
l Exemplo: ficheiro de texto (compara.m)
f u n c t i o n i g u a l = c
Mudança de linha (carriage return, line feed)
espaço
Sistemas de Ficheiros
l 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).
l Nesta árvore, a pesquisa de um ficheiro é eficiente.
Sistemas de Ficheiros
l Raiz • C:\
• Programas • Matlab • Office
• word.exe • Users
• Luis • ICE • ...
C:\
Programas Users
Office
Word.exe
Luis
Sistemas de Ficheiros
l O separador (\ em Windows) indica que a subdirectoria ou ficheiro está localizados numa directoria.
l 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 (C:\users\am.fonseca).
• ICE\ahetal.m
Sistemas de Ficheiros
l Notações especiais (que podem ser usadas nos caminhos): • . (ponto) representa a directoria corrente; • .. (dois pontos) representa a directoria pai da directoria
corrente.
l O comando cd <nomeDaDirectoria> muda a directoria corrente.
Sistemas de Ficheiros
l 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).
l Nesta árvore, a pesquisa de um ficheiro é eficiente.
Acesso aos Ficheiros
l Para ler ou escrever num ficheiro é preciso “abrir” o ficheiro • Ou seja, pedir ao sistema operativo que nos dê acesso ao
ficheiro.
l No final é preciso “fechar” o ficheiro • Ou seja, notificar o sistema operativo de que já não estamos
a usar o ficheiro
Acesso aos Ficheiros
l O acesso ao ficheiro é sequencial • À medida que se lê ou escreve avança-se no ficheiro
Posição corrente
• Leitura de nelems de tamanho T • Ao deslocamento corrente é somado
nelems*T.
Início Fim
• Posição corrente após a leitura
Acesso aos Ficheiros
l 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' )
Acesso aos Ficheiros
l 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
Acesso aos Ficheiros
l Escrever no ficheiro, em MATLAB • fprintf para escrever uma string inserindo e formatando
valores adicionais em que a formatação é indicada por % • %i inteiro, decimal • %f fraccionári • %.2f fracionário com 2 casas decimais • %% sinal de percentagem • \n mudança de linha • \t tab
• Nota: omitindo o identificador fich, escreve na consola
Acesso aos Ficheiros
l Ler do ficheiro, em MATLAB • Função fgetl permite ler uma linha do ficheiro
• Ou seja, um conjunto de bytes, 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)
feof(fich)
Calcular Pauta
l 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.
Calcular Pauta
l 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 • ou codificado em
XML...
Calcular Pauta
l Copiamos para um editor de texto simples e gravamos como texto.
notas.txt
• Melhor: Guardamos a folha de cálculo directamente num formato texto.
Calcular Pauta
l Seguidamente, precisamos de • Ler o ficheiro para uma matriz com 5 colunas
• Número, TP1,TP2, T1, T2 • Calcular a pauta da avaliação
• Usar a função calculapauta • Gravar a matriz calculada no ficheiro
pauta.txt
Calcular Pauta
l Já temos funções para calcular a pauta
function 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)
• arredonda o valor para o número de casas decimais indicado
Calcular Pauta
l Vamos então analisar os outros passos • Ler o ficheiro para uma matriz com as notas
function notas = lenotas(nomeFich)
• Gravar a matriz calculada no ficheiro
function gravapauta(pauta,nomeFich)
• Juntar tudo
function gerapauta(nomeNotas,nomePauta)
Calcular Pauta
Abre o ficheiro para leitura e guarda o identificador, necessário para as outras funções.
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.
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)
Calcular Pauta
É importante fechar o acesso ao ficheiro para o sistema operativo permitir que outros processos acedam ao ficheiro.
Calcular Pauta
l Testar a leitura 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 ...
Calcular Pauta
Abre o ficheiro para escrita e escreve o cabeçalho. \t é um tabulador, \n para mudar de linha
Calcular Pauta
Para cada linha da pauta escreve o número, um tab, e o valor (inteiro) da nota ou o texto.
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
Calcular Pauta
l Testar com uma pauta simplificada
l Ler ficheiro produzido (‘testepauta.txt)
octave:8> pauta=[1,-1;2,9;3,14] pauta = 1 -1 2 9 3 14 octave:9> gravapauta(pauta,'testepauta.txt')
Aluno Nota 1 Excluído 2 Admitido 3 14
Calcular Pauta
l Testar com as notas lida do ficheiro
octave:9> gerapauta('notas.txt','pauta.txt') Número TP1 TP2 T1 T2 60133 3.3 1.6 7.4 7 60136 4.9 0 0 10.4 60137 11.3 14.9 14.8 3.9 60145 6.3 16.4 16.3 6.8 60148 8 11.7 17 5.9 60157 8.4 2.1 16.6 4.6 60161 0 12.4 10.6 5.4 60166 15.3 7.6 18 14.3 60175 12.1 10 0 6.1 60182 7.2 5.2 0.6 6.2 60184 8.5 18.8 11 0 60190 12.6 9.4 4.3 10.1 ...
Aluno Nota 60133 Excluído 60136 Excluído 60137 Admitido 60145 11 60148 10 60157 Excluído 60161 Admitido 60166 14 60175 Admitido 60182 Excluído 60184 Admitido 60190 Admitido ...
Calcular Pauta
l Mesmo problema de criar a pauta, mas a partir de uma listagem dos alunos e trabalhos:
• número • [TP1:] • [TP2:] • [T1:] • [T2:]
• Nota: Os elementos em falta são 0
60133 TP1:3.3 TP2:1.6 T1:7.4 T2:7 60136 TP1:4.9 T2:10.4 60137 TP1:11.3 TP2:14.9 T1:14.8 T2:3.9 ...
Calcular Pauta
l O problema é o mesmo, mas há que
• substituir a função que lê as notas: function notas = lenotas(nomeFich)
• … por uma que as leia no novo formato de lista function notas = lelistanotas(nomeFich)
• ... e substituir a função que junta tudo function geradalista(nomeNotas,nomePauta)
Calcular Pauta
l 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 as restantes colunas a 0.
Calcular Pauta
l Algoritmo para ler a lista de elementos de avaliação:
• Se a linha contém TP1:, TP2:, etc, • usar findstr
• verificar se o resultado não é um vector vazio • length( … ) ~= 0 ou • ~isempty( … )
Calcular Pauta
Caso contrário é preciso criar uma linha nova com o número e 0 nos elementos de avaliação.
Calcular Pauta
l Testar a leitura das novas notas
octave:11> lelistanotas('listagem.txt') ans =
60133 3.30 1.60 7.40 7.00 60136 4.90 0.00 0.00 10.40 60137 11.30 14.90 14.80 3.90 60145 6.30 16.40 16.30 6.80 60148 8.00 11.70 17.00 5.90 60157 8.40 2.10 16.60 4.60 60161 0.00 12.40 10.60 5.40 60166 15.30 7.60 18.00 14.30 60175 12.10 10.00 0.00 6.10 60182 7.20 5.20 0.60 6.20 60184 8.50 18.80 11.00 0.00 ...
60133 TP1:3.3 TP2:1.6 T1:7.4 T2:7 60136 TP1:4.9 T2:10.4 60137 TP1:11.3 TP2:14.9 T1:14.8 T2:3.9 ...
Calcular Pauta
l Na realidade 60133 TP1:3.3 TP2:1.6 T1:7.4 T2:7 60136 TP1:4.9 T2:10.4 60137 TP1:11.3 TP2:14.9 T1:14.8 T2:3.9 ...
octave:11> lelistanotas('listagem.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
...
Calcular Pauta
l Testar a leitura das notas
geradalista('listagem.txt','pautalista.txt')
Aluno Nota 60133 Excluído 60136 Excluído 60137 Admitido 60145 10 60148 10 60157 Excluído 60161 Admitido 60166 14 60175 Admitido 60182 Excluído 60184 Admitido 60190 Admitido ...
pautalista.txt
60133 TP1:3.3 TP2:1.6 T1:7.4 T2:7 60136 TP1:4.9 T2:10.4 60137 TP1:11.3 TP2:14.9 T1:14.8 T2:3.9 ...
Para estudar a aula de hoje
l 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