51
Informá(ca para as Ciências e Engenharias Versão : C (Engenharia Civil) Aula 7 Pedro Barahona 2016 / 17

Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

  • Upload
    vunhu

  • View
    217

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Informá(caparaasCiênciaseEngenhariasVersão:C

(EngenhariaCivil)Aula7

PedroBarahona2016/17

Page 2: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Sumário

•  Ficheiros.Ficheirosdetextoebinários.•  Sistemadeficheiros.•  Operaçõessobreficheirosdetexto.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 2

Page 3: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

ProblemadaPautadeICEcomFicheiros[1]

•  FaçaumprogramaqueproduzapautacomasnotasfinaisdeICEporavaliação conWnua, comos dados do ficheiro notasAC.txt. A pauta éescritanoficheiropautaAC.txt.

•  O ficheiro notasAC.txt tem uma linha por aluno, com o número asnotasdosdoisexercíciosedotrabalhoedosdoistestesdoaluno(nº,exer1, exer2, trab, teste1, teste2). Os números estão separados porumespaço.

•  Alinhaterminacomumcaracter“fimdelinha”(representadopor↵)

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 3

5832215.516.418.015.714.8↵5741312.39.29.48.77.2↵550648.04.57.28.110.2↵...

notasAC.txt

Page 4: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

ProblemadaPautadeICEcomFicheiros[2]

•  OficheiropautaAC.txt temumaprimeira linhacom 'Numero'e 'NotaFinal',separadosporumtab(representadopor») .Depois,temmaisumalinhaporcadaaluno,comonúmeroeanotafinalporavaliaçãoconWnuadoaluno(nºenotaFinal),separadosporumtab.

•  AnotaFinaldeumalunoé:§  uminteiroentre10e20,seoalunoaprovou;§  ‘Admi(do’,seoalunotemfrequênciaereprovou;§  ‘Excluido’,seoalunonãotemfrequência.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 4

Numero»NotaFinal↵58322»16↵5713»Admitido↵55064»Excluido↵...

pautaAC.txt

Page 5: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Resolução–Problema[1]

1.  Compreendertotalmenteoproblema.•  Os dados de entrada e de saída estão em ficheiros de texto:

notasAC.txtepautaAC.txt.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 5

è

Numero»NotaFinal↵58322»16↵5713»Admitido↵55064»Excluido↵...

pautaAC.txt

5832215.516.418.015.714.8↵5741312.39.29.48.77.2↵550648.04.57.28.110.2↵...

notasAC.txt

Page 6: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Resolução–Problema[2]

2.  Caracterizaroproblema.•Problema: PautadeICEcomficheiros.•Entrada: nomeFichNotas,nomeFichPauta.•Saída: nenhuma.OficheironomeFichPautaécriadoeescrito.

3.  Generalizaroproblema(semprequeforpossível).•  Nãoépossívelgeneralizaresteproblema.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 6

Page 7: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Resolução–Algoritmo[1]

4.  Desenharoalgoritmopararesolveroproblema.a)  Conceberoalgoritmo,decompondooproblemaemsub-problemas.

•  ComoproduziroficheirotendonomeFichNotasenomeFichPauta?1.  Ler os dados do ficheiro nomeFichNotas e colocá-los numa

matriz(notasAC).2.  Geraramatrizpautaapar(rdamatriznotasAC.3.  EscreverosresultadosnoficheironomeFichPautacomamatriz

pauta.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 7

Page 8: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Resolução–Algoritmo[2]

b)  Iden(ficar,caracterizaregeneralizarcadasub-problema.•Problema: Leituradasnotas(deavaliaçãoconWnua).•Entrada: (string)nomeFichNotas.•Saída: matrizdenúmeros,comumalinhaporalunoeseis

colunas(nº,E1,E2,P,T1,T2).

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 8

Page 9: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Resolução–Algoritmo[3]

b)  Iden(ficar,caracterizaregeneralizarcadasub-problema.•Problema: PautadeICE.•Entrada: matrizdenúmeros,comumalinhaporalunoeseis

colunas(nº,E1,E2,P,T1,T2).•Saída: matrizdenúmeros,comumalinhaporalunoeduas

colunas(nºeNF).

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 9

Page 10: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Resolução–Algoritmo[4]

b)  Iden(ficar,caracterizaregeneralizarcadasub-problema.•Problema: Escritadapauta.•Entrada: (string)nomeFichPauta;matrizdenúmeros,comuma

linhaporalunoeduascolunas(nºeNF).•Saída: nenhuma.OficheironomeFichPautaécriadoeescrito.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 10

Page 11: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Resolução–Algoritmo[5]

c)  Conceber o algoritmo, assumindo que os sub-problemas estãoresolvidos.

•  PautadeICEcomficheiros(nomeFichNotas,nomeFichPauta):•  notasACçleNotas(nomeFichNotas).•  pautaçpautaICE(notasAC).•  escrevePauta(nomeFichPauta,pauta).

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 11

Page 12: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Resolução–Algoritmo[6]

5.  Paracadasub-problema,desenharoalgoritmoparaoresolver.•  Leituradasnotas(nomeFichNotas): (leituradeficheiro)•  PautadeICE(notasAC): (feitonaaulateóricanº4)•  Escritadapauta(nomeFichPauta,pauta): (escritaemficheiro)

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 12

Page 13: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Implementação–Quequestões?

1.  Comoéqueselêdeumficheiro?§  Noproblema:leNotas.

2.  Comoéqueseescrevenumficheiro?§  Noproblema:escrevePauta.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 13

Page 14: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Sumário

•  Ficheiros.Ficheirosdetextoebinários.•  Sistemadeficheiros.•  Operaçõessobreficheirosdetexto.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 14

Page 15: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Ficheiro

•  Ficheirospermitemguardarinformaçãodeformapermanente.•  Um ficheiro é um espaço de endereçamento logicamente conWguo,

contendo um conjunto de dados “inter-relacionados”. É acessívelatravésdeumiden(ficadorúnico(nome).

•  Onomedeumficheiroéumasequênciadecaracteres(umastringemMatlab).

•  Um ficheiro pode conter dados (texto, imagem, som, etc.) ouprogramas.

•  O SO encarrega-se de gerir os ficheiros e os discos em que estesresidem. A organização do disco é escondida aos programadores eu(lizadores.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 15

Page 16: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Discos

•  Discosrígidos(magné(cos-HD)§  Mecânico: rotação do disco e

deslocamentodacabeçaparalereescreverinformação.

•  Discosdeestadosólido(SSD)

§  Eletrónico: acesso imediato aqualquer posição para ler eescrever.

§  Mais rápidosqueosdiscos rígidos(magné(cos).

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 16

Page 17: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Tiposdeficheiros

•  Ficheirosdetexto§  Contêm apenas bytes que podem ser interpretados como

caracteresimprimíveis: letrasmaiúsculaseminúsculas,algarismosesinaisdepontuação.

§  AcodificaçãousadaéaASCIIouumaderivadadesta.•  Ficheirosbinários

§  Ainterpretaçãodoseuconteúdoestáacargodoprogramaqueou(liza; contêm bytes que não correspondem a caracteresimprimíveis.

§  Podemserdados(inteiros,reais),programas(códigosmáquinadeum dado CPU), sons (segundo uma codificação como o MP3),imagens (codificadas num formato como o JPEG), filmes (noformatoMPEG,porexemplo),etc.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 17

Page 18: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Ficheiroimprime.m

•  O ficheiro imprime.m contém um programa na linguagem MATLAB(queescrevemensagensnoecrã).§  Maisprecisamente, repetenvezesapalavra ´hello’,mudandode

linhanofinal(caracter“\n”)

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 18

function imprime( n )!

!for i=1:n!! !fprintf(‘hello\n’)!!end!

end!

Page 19: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

imprime.m codificado em ASCII

f 102

u 117

n 110

c 99

t 116

i 105

o 111

n 110

<sp> 32

I 73

m 109

p 112

r 114

i 105

m 109

e 101

( 40

<sp> 32

n 110

<sp> 32

) 41

<nl> 10

<tab> 9

f 102

o 111

r 114

<sp> 32

i 105

= 61

1 49

: 58

n 110

<nl> 10

<tab> 9

<tab> 9

f 102

p 112

r 114

i 105

n 110

t 116

f 102

( 40

‘ 33

h 104

e 101

l 108

l 108

o 111

\ 92

n 110

‘ 33

) 41

; 59

<nl> 10

<tab> 9

e 101

n 119

d 100

<nl> 10

e 101

n 110

d 100

<nl> 10

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 19

Page 20: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Sumário

•  Ficheiros.Ficheirosdetextoebinários.•  Sistemadeficheiros.•  Operaçõessobreficheirosdetexto.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 20

Page 21: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Sistemadeficheiros[2]

•  Osistemadeficheirosestáorganizadohierarquicamenteemformadeárvore(“inver(da”).§  Raiz(adiretoriadotopo,daqual“descendem”asoutrasdiretorias

eosoutrosficheiros).«  C:\Windows

§  Ramos(asoutrasdiretorias).§  Folhas(ficheiros).

•  Cadadiretoriapodeconterficheiroseoutras(sub-)diretorias.•  Nestaárvore,apesquisadeumficheiroéeficiente.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 21

Page 22: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Sistemadeficheiros[1]

x.log

Raiz C:\ Windows Diretoria Raiz

Diretoria Ficheiro

Programs Users

Matlab Office Luis

matlab.exe word.exe

ICE AM1

fact.m 24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 22

teste1.doc x.m

Page 23: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Sistemadeficheiros[3]

•  Oseparador(\emWindows)éusadoparaindicarquesubdiretoriaseficheirosestãolocalizadosnumadiretoria.

•  Ocaminhoparaoficheiro(pathname)podeser:§  absoluto–ocaminhocompletoapar(rdadiretoriaraiz;§  rela(vo–ocaminhoapar(rdadiretoriacorrente.

•  Notaçõesespeciais(quepodemserusadasnoscaminhos):§  “.”representaadiretoriacorrente;§  “..”representaadiretoriapaidadiretoriacorrente.

•  Ocomandocd<nomeDaDiretoria>mudaadiretoriacorrente.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 23

Page 24: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Sistemadeficheiros[1]

x.log

Raiz C:\ Windows Diretoria Raiz

Programs Users

Matlab Office Luis

matlab.exe

ICE AM1

fact.m 24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 24

teste1.doc x.m

Nome absoluto: C:\Users\Luis\ICE\fact.m Nome relativo: ICE\fact.m

Diretoria corrente: C:\Users\Luis

Page 25: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Sumário

•  Ficheiros.Ficheirosdetextoebinários.•  Sistemadeficheiros.•  Operaçõessobreficheirosdetexto.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 25

Page 26: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Ficheiros–Abertura…fecho

•  Para lerouescrevernumficheiro,énecessário começarporabriroficheiro.

•  Àmedidaqueselê/escreve,aposiçãocorrenteavança.•  Nofimdasleituras/escritas,énecessáriofecharoficheiro.

Posição corrente

Início Fim

Posição corrente após a leitura

Leitura de N bytes do ficheiro. Ao deslocamento corrente é somado N.

N

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 26

Page 27: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Aberturadeumficheiro

•  Afunção(instrução)fich = fopen( nomeFicheiro, ’r’ )

fich = fopen( nomeFicheiro, ’w’ )

permitem abrir um ficheiro nomeFicheiro para leitura (’r’, read) ouparaescrita(’w’,write)eretorna:§  um número não nega(vo, que é o iden(ficador do ficheiro no

contextodoprograma,seaoperação(versucesso;§  −1,emcasodeerro.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 27

% abertura do ficheiro ‘notasAC.txt’ % em modo de leitura fichN = fopen(‘notasAC.txt’, ‘r’; % abertura do ficheiro ‘pautaAC.txt’ % em modo de leitura fichP = fopen(’pautaAC.txt’, ’w’);

Page 28: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Fechodeumficheiro

•  Afunção(instrução)res = fclose( fich )

permitefecharoficheiroiden(ficadoporficheretorna:§  0,seaoperação(versucesso;§  −1,emcasodeerro.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 28

% fecho do ficheiro ‘notasAC.txt’ % aberto em modo de leitura % com identificador fichN resN = fclose(fichN); % fecho do ficheiro ‘pautaAC.txt’ % aberto em modo de leitura % com identificador fichP resP = fclose(fichP);

Page 29: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Memória central (RAM)

Escrita num ficheiro

•  Naescritadeumficheiro,ainformaçãoguardadanamemóriacentralétransferidaparaodisco.

Zona de memória com N bytes

Disco

N bytes contíguos do

ficheiro

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 29

Page 30: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Escritanumficheirodetexto

•  Afunção(instrução)res = fprintf( fich, formato, v1, v2, ..., vn )

(comn≥0)escrevea string formato, “preenchida”comosvaloresv1, v2, ..., vn,noficheiroiden(ficadoporfich.

•  Retornaonúmerodebytesescritosnoficheiro.

•  NOTA: Esta função é semelhante à anterior, prin:, que escreve astringformatonoecrã.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 30

% Escrita de uma linha (no ficheiro aberto com % identificador fichP) contendo os números 50123 e 17, % separados por um tab. fprintf(fichP, ’%d\t%d\n’, 50123, 17); % o numero de bytes escritos é “desprezado”

Page 31: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Formatos

•  Um formato é uma string com informação sobre o (po dos valoresomissos(aescreveroualer).

•  Alguns(posfrequentes:§  %d númerointeiro(comsinal);Nota:%iéequivalente.§  %f númeroreal§  %s string§  %c carácter

•  Algunscaracteresespeciaisdeformatação:§  \n mudançadelinha§  \t tab

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 31

Page 32: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Formatos–Exemplo

>> num = 50123;!>> nota = 17;!>> fichE = fopen(’exemplo.txt’, ’w’);!fichE = 23 % o id retornado pode ser outro!>> str = ’aprovado’;!>> x = fprintf(fichE, ’Numero %d\tNota final %d (%s).\n’, ...!num, nota, str) !% é escrita uma linha no ficheiro sem eco no terminal!x = 39!>> close(fichE)!% podia-se ter verificado se o ficheiro foi bem fechado...!>> printf(’Numero %d\tNota final %d (%s).\n’, ...!num, nota, str) !% a mesma ordem de escrita mas para o terminal!Numero 50123 Nota final 17 (aprovado).!

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 32

Page 33: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Memória central (RAM)

Leituradeumficheiro

•  Na leitura de um ficheiro, a informação guardada no disco étransferidaparaamemóriacentral.

•  Sósepodemlerdadosseaposiçãocorrentedoficheironãoes(vernofimdoficheiro.

Zona de memória com N bytes

Disco

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 33

N bytes contíguos do

ficheiro

Page 34: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Testeaofimdeumficheiro

•  Para evitar ler umficheiro para alémdo seu final (o que origina umerro)deverserverificadosejásea(ngiuoseufimcomainstrução

valorLógico = feof( fich )

•  Quepermitetestarseaposiçãocorrentedoficheiro,iden(ficadoporfich,a(ngiuoseufinal(eoféaabreviaturadeendoffile)eretorna:§  true(1),se(verchegadoaofim;§  false(0),senão(verchegadoaofim.§  TipicamenteumficheiroélidonumcicloWHILE

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 34

while !feof(fich)! ... % ler o conteúdo do ficheiro identificado por fich! end!

Page 35: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Leituradeumalinhadoficheiro

•  Tipicamenteumficheiroélidolinhaalinhacomainstruçãostr = fgetl( fich )

quelêtodososcaracteresdoficheiroiden(ficadoporfich,daposiçãocorrenteatéaofimdalinha,eretorna-os(excetoo‘\n’)nastringstr.

•  Senãolernada,porhaverumalinhavazia,retorna−1.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 35

% leitura de linha do ficheiro de notas!>> linha = fgetl(fichN); !

% Se fosse a primeira linha lida, a variável linha seria a string!

% ’58322 15.5 16.4 18.0 17.7 14.8’.!

5832215.516.418.015.714.8↵5741312.39.29.48.77.2↵550648.04.57.28.110.2↵...

notasAC.txt

Page 36: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Resolução–Programa[1]

6.  Para cada sub-problema (começando pelos mais simples),implementarorespe(voalgoritmoetestaro“sub-programa”.

•Problema: Leituradasnotas(deavaliaçãoconWnua).•Entrada: (string)nomeFichNotas.•Saída: matrizdenúmeros,comumalinhaporalunoeseiscolunas(nº,

E1,E2,P,T1,T2).

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 36

function notas = leNotas( nomeFich ) % documentacao em anexo notas = []; % Criar uma matriz notas vazia. fich = fopen(nomeFich, 'r'); % Abrir o ficheiro para leitura. while ~feof(fich) linha = fgetl(fich); % Ler uma linha do ficheiro. notas = [notas ; str2num(linha)]; end fclose(fich); % Fechar o ficheiro. end

Amatriznotascomeçavaziapoisnãosesabeoseutamanho!

Page 37: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

RegradeProgramação

•  Ocódigodevesereficiente.§  Os vetores e as matrizes devem ser criados com as posições

necessárias,paraquenãoseescrevanumaposiçãoinexistente.§  A única exceção à regra anterior é quando os dados vêm de

ficheiro e não sabemos prever o seu número. A alterna(va seriapercorreroficheiroduasvezes,oqueseriaaindamaisineficiente.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 37

Page 38: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Resolução–Programa[2]

6.  Para cada sub-problema (começando pelos mais simples),implementarorespe(voalgoritmoetestaro“sub-programa”.

•Problema: Escritadapauta.•Entrada: (string)nomeFichPauta;matrizdenúmeros,comumalinhapor

alunoeduascolunas(nºeNF).•Saída: nenhuma.OficheironomeFichPautaécriadoeescrito.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 38

function escrevePauta( nomeFich, pauta ) % documentacao em anexo fich = fopen(nomeFich, 'w'); % Abrir o ficheiro para escrita. fprintf(fich, 'Numero\tNota Final\n'); % Escrever a 1ª linha. numAlunos = size(pauta, 1); for i = 1 : numAlunos % Escrever uma linha por aluno (...) end fclose(fich); % Fechar o ficheiro. end

Page 39: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Resolução–Programa[2]

•  Paracadaalunoescreve-senoficheiroumalinhaquecomeçapeloseunúmero e termina num valor inteiro (>= 19) ou uma das palavras‘Admi(do’ou‘Excluido’,consoanteanotaob(da.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 39

... for i = 1 : numAlunos numero = pauta(i, 1); nota = pauta(i, 2); if nota >= 10 fprintf(fich, '%d\t%d\n', numero, nota); elseif nota >= 0 fprintf(fich, '%d\tAdmitido\n', numero); else fprintf(fich, '%d\tExcluido\n', numero); end end ...

Page 40: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Resolução–Programa[3]

7.  Implementar o algoritmo que resolve o problema e testar oprogramapedido.

•Problema: PautadeICEcomficheiros.

•Entrada: nomeFichNotas,nomeFichPauta.•Saída: nenhuma.OficheironomeFichPautaécriadoeescrito.

•  Quepodeserchamadadiretamentedaconsola

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 40

function pautaICEFich( nomeFichNotas, nomeFichPauta )

% documentacao em anexo

notasAC = leNotas(nomeFichNotas);

pauta = pautaICE(notasAC); % como na aula 4

escrevePauta(nomeFichPauta, pauta);

end

>> pautaICEFich(‘notasAC.txt’, ‘pautaAC.txt’)

Page 41: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

ProblemadaPautadeICEcomFicheiros–versão2

•  FaçaumprogramaqueproduzapautacomasnotasfinaisdeICEporavaliaçãoconWnua,comosdadosdoficheironotasAC_v2.txt.ApautaéescritanoficheiropautaAC.txt(talcomona1ªversão).

•  OficheironotasAC_v2.txttemdois(posdelinhas:§  <númerodoaluno>

Aslinhasqueseseguemdizemrespeitoaestealuno.§  <prova>:<notanaprova>

onde<prova>é‘exercicio1’,‘exercicio2’,‘trabalho’,‘teste1’

ou‘teste2’.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 41

Page 42: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Resolução–Problema_v2

1.  Comp r e ende r t o t a lmen t eoproblema.

•  O formato das linhas dos ficheirosdedadosédiferente.

•  Oproblemaésemelhantepeloquenos concentraremos no sub-problemadeleituradasnotas.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 42

5832215.516.418.015.714.8↵5741312.39.29.48.77.2↵550648.04.57.28.110.2↵...

notasAC.txt

58322↵exercicio1:15.5↵exercicio2:16.4↵trabalho1:18.0↵teste1:15.7↵teste2:14.8↵57413↵exercicio1:12.3↵exercicio2:9.2↵trabalho1:9.4↵teste1:8.7↵teste2:7.2↵(...)

notasAC_v2.txt

Page 43: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Resolução–Algoritmo_v2[1]

4.  Desenharoalgoritmopararesolveroproblema.•  PautadeICEcomficheirosv2(nomeFichNotas,nomeFichPauta):

•  LerosdadosdoficheironomeFichNotasecolocá-losnumamatriz(notasAC).

•  notasACçleNotas_v2(nomeFichNotas).

•  PautaçpautaICE(notasAC).

•  escrevePauta(nomeFichPauta,pauta).

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 43

Page 44: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Resolução–Algoritmo_v2[2]

5.  Paracadasub-problema,desenharoalgoritmoparaoresolver.Leituradasnotas(nomeFichNotas):§  notasç[].§  Enquanto não se (ver chegado ao fim do ficheiro, ler uma nova

linhaeextrairo(poeonúmero.«  (po:1–nºdealuno;2–E1;3–E2;4–P;5–T1;6–T2.«  número:onúmerodoalunoouanotadaprova.

§  Se(po==1,notasç[notas;numero,0,0,0,0,0].§  Se(po≠1,notas(<linhacorrente>,(po)çnúmero.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 44

Page 45: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Resolução–Algoritmo_v2[3]

5.  Paracadasub-problema,desenharoalgoritmoparaoresolver.ExtrairIpoenúmero(linha):§  Encontrarasposiçõesdo‘:’nalinha.§  Senãohá‘:’nalinha:o(poé1;onúmeroocupatodasasposições

dalinha.§  Se há ‘:’ na linha: descobre-se o (po comparando a string à

esquerdade‘:’com‘trabalho1’,‘trabalho2’e‘teste1’;onúmeroocupaasposiçõesàdireitade‘:’.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 45

Page 46: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Resolução–Programa_v2[1]

6.  Para cada sub-problema (começando pelos mais simples),implementarorespe(voalgoritmoetestaro“sub-programa”.

•Problema: Extrair(poenúmero.•Entrada: (string)linha.•Saída: (inteiro)(po,(inteiro)número.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 46

function [tipo, numero] = extraiTipoENum(linha) % documentacao em anexo

posicoes = findstr(linha, ':');

if length(posicoes) == 0 % Formato linha: <numero do aluno>

tipo = 1;

numero = str2num(linha);

else % Formato da linha: <prova>:<nota na prova>

(...)

end end

Page 47: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Resolução–Programa_v2[2]

•  Oblocoelsedeterminao(poeonúmeroadevolver.

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 47

else % Formato da linha: <prova>:<nota na prova> pos = posicoes(1); prova = linha(1 : pos−1); if strcmp(prova, ’exercicio 1') == 1 tipo = 2; elseif strcmp(prova, ’exercicio 2') == 1 tipo = 3; elseif strcmp(prova, ’trabalho') == 1 tipo = 4; elseif strcmp(prova, 'teste 1') == 1 tipo = 5; else % strcmp(prova, 'teste 2') == 1 tipo = 6; end numero = str2num( linha(pos+1 : end) ); end

Page 48: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Resolução–Programa_v2[3]

6.  Para cada sub-problema (começando pelos mais simples),implementarorespe(voalgoritmoetestaro“sub-programa”.

•Problema: Leituradasnotas(versão2).•Entrada: (string)nomeFichNotas.•Saída: matrizdenúmeros,comumalinhaporalunoeseiscolunas(nº,

E1,E2,P,T1,T2).

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 48

function notas = leNotas_v2( nomeFich ) % documentacao em anexo notas = []; % Criar uma matriz notas vazia. fich = fopen(nomeFich, 'r'); % Abrir o ficheiro para leitura. while ~feof(fich)

linha = fgetl(fich); % Ler uma linha do ficheiro.

... end fclose(fich); % Fechar o ficheiro. end

Page 49: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Resolução–Programa_v2[4]

6.  Para cada sub-problema (começando pelos mais simples),implementarorespe(voalgoritmoetestaro“sub-programa”.

•Problema: Leituradasnotas(versão2).•Entrada: (string)nomeFichNotas.•Saída: matrizdenúmeros,comumalinhaporalunoeseiscolunas(nº,

E1,E2,P,T1,T2).

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 49

... while ~feof(fich) linha = fgetl(fich); % Ler uma linha do ficheiro. [tipo, numero] = extraiTipoENum(linha); if tipo == 1 % acrescenta uma linha notas = [notas ; numero, 0, 0, 0, 0, 0]; else % insere a nota na coluna = tipo notas(end, tipo) = numero; end end ...

Page 50: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

Resolução–Programa_v2[3]

7.  Implementar o algoritmo que resolve o problema e testar oprogramapedido.

•Problema: PautadeICEcomficheiros(versão2).•Entrada: (string)nomeFichNotas,(string)nomeFichPauta.•Saída: nenhuma.OficheironomeFichPautaécriadoeescrito.

•  Quepodeserchamadadiretamentedaconsola

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 50

function pautaICEFich_v2( nomeFichNotas, nomeFichPauta )

% documentacao em anexo

notasAC = leNotas_v2(nomeFichNotas);

pauta = pautaICE(notasAC); % como na aula 4

escrevePauta(nomeFichPauta, pauta);

end

>> pautaICEFich_v2(‘notasAC_v2.txt’, ‘pautaAC_v2.txt’)

Page 51: Informáca para as Ciências e Engenharias Versão : C ...icec.ssdi.di.fct.unl.pt/1617/teoricas/T07/icec_t07.pdf · imprime.m codificado em ASCII f 102 u 117 n 110 c 99 ... Matlab

ParaEstudarestaAula

•  ManualdoOctave§  Capítulo14

«  Temváriasfunçõesquepodemserúteis

•  (ouconfusas)

«  Estassecçõesfocampar(cularmenteoquedemosaqui:

•  14.2.1OpeningandClosingFiles

•  14.2.3Line-OrientedInput

•  14.2.4Forma�edOutput

24Abril2017 7:SistemasdeFicheiros;Operaçõessobreficheirosdetexto 51