• Nenhum resultado encontrado

Redirecionamento de E/S

N/A
N/A
Protected

Academic year: 2022

Share "Redirecionamento de E/S"

Copied!
33
0
0

Texto

(1)

Arquivos

Prof. Dr. Silvio do Lago Pereira

Departamento de Tecnologia da Informação Faculdade de Tecnologia de São Paulo

(2)

Arquivos

teclado programa vídeo

buffer

disco

Um arquivo é uma coleção homogênea de itens que reside em disco.

#include <stdio.h>

...

FILE *arq, *ent, *sai;

...

#include <stdio.h>

...

FILE *arq, *ent, *sai;

...

(3)

Arquivos-padrão

Ponteiro Finalidade Dispositivo Arquivo stdin entrada padrão teclado con

stdout saída padrão vídeo con

stderr Saída padrão de erros vídeo stdaux saída auxiliar porta serial aux stdprn Saída de impressora porta paralela prn

#include <stdio.h>

void main(void) {

fprintf(stdprn,"1, 2, 3, testando...\n");

}

#include <stdio.h>

void main(void) {

fprintf(stdprn,"1, 2, 3, testando...\n");

}

(4)

Redirecionamento de E/S

/* cat.c */

#include <stdio.h>

void main(void) { int c;

while( (c=getchar())!=EOF ) putchar(c);

}

/* cat.c */

#include <stdio.h>

void main(void) { int c;

while( (c=getchar())!=EOF ) putchar(c);

}

(5)

Sem redirecionamento

C:\> cat ↵ ↵ ↵ ↵ um ↵ ↵ ↵ ↵

um

texto ↵ ↵ ↵ ↵ texto

qualquer ↵ ↵ ↵ ↵ qualquer

^Z ↵ ↵ ↵ ↵

C:\> _

C:\> cat ↵ ↵ ↵ ↵ um ↵ ↵ ↵ ↵

um

texto ↵ ↵ ↵ ↵ texto

qualquer ↵ ↵ ↵ ↵ qualquer

^Z ↵ ↵ ↵ ↵

C:\> _

(6)

Sem redirecionamento

C:\> cat ↵ ↵ ↵ ↵ um ↵ ↵ ↵ ↵

um

texto ↵ ↵ ↵ ↵ texto

qualquer ↵ ↵ ↵ ↵ qualquer

^Z ↵ ↵ ↵ ↵

C:\> _

C:\> cat ↵ ↵ ↵ ↵ um ↵ ↵ ↵ ↵

um

texto ↵ ↵ ↵ ↵ texto

qualquer ↵ ↵ ↵ ↵ qualquer

^Z ↵ ↵ ↵ ↵

C:\> _

(7)

Com redirecionamento de saída

C:\> cat > arq.txt ↵ ↵ ↵ ↵ um ↵ ↵ ↵ ↵

texto ↵ ↵ ↵ ↵

qualquer ↵ ↵ ↵ ↵

^Z ↵ ↵ ↵ ↵

C:\> _

C:\> cat > arq.txt ↵ ↵ ↵ ↵ um ↵ ↵ ↵ ↵

texto ↵ ↵ ↵ ↵

qualquer ↵ ↵ ↵ ↵

^Z ↵ ↵ ↵ ↵

C:\> _

(8)

Com redirecionamento de entrada

C:\> cat < arq.txt ↵ ↵ ↵ ↵ um

texto

qualquer C:\> _

C:\> cat < arq.txt ↵ ↵ ↵ ↵ um

texto

qualquer

C:\> _

(9)

Exercício

Usando o comando cat e redirecionamento de E/S:

copiar um arquivo do HD para o disquete;

imprimir um arquivo na impressora (sic).

(10)

Operações em arquivo

Abertura

a = fopen(“nome”,”modo”);

Fechamento

fclose(a);

fcloseall();

Verificação de final de arquivo

feof(a)

E/S de caracter

c = fgetc(a);

fputc(c,a);

(11)

Exemplo - mytype

#include <stdio.h>

void main(int argc, char *argv[]) { FILE *e;

if(argc==2 && e=fopen(argv[1],"r")) { while( 1 ) {

c = fgetc(e);

if( feof(e) ) break;

putchar(c);

}

fclose(e);

}

else puts(”Arquivo não pode ser aberto");

#include <stdio.h>

void main(int argc, char *argv[]) { FILE *e;

if(argc==2 && e=fopen(argv[1],"r")) { while( 1 ) {

c = fgetc(e);

if( feof(e) ) break;

putchar(c);

}

fclose(e);

}

else puts(”Arquivo não pode ser aberto");

(12)

Exemplo - mycopy

#include <stdio.h>

void main(int argc, char *argv[]) { FILE *ent, *sai;

if( argc!=3 ) {

puts(“mycopy <org> <dst>”);

exit(1);

}

if( (ent=fopen(argv[1],"r"))==NULL ) { puts(”erro de abertura");

exit(2);

}

#include <stdio.h>

void main(int argc, char *argv[]) { FILE *ent, *sai;

if( argc!=3 ) {

puts(“mycopy <org> <dst>”);

exit(1);

}

if( (ent=fopen(argv[1],"r"))==NULL ) { puts(”erro de abertura");

exit(2);

}

(13)

Exemplo - mycopy

if( (sai=fopen(argv[2],”w"))==NULL ) { puts(”erro de criação");

exit(3);

}

while( 1 ) {

c = fgetc(ent);

if( feof(ent) ) break;

fputc(c,sai);

}

fclose(ent);

fclose(sai);

if( (sai=fopen(argv[2],”w"))==NULL ) { puts(”erro de criação");

exit(3);

}

while( 1 ) {

c = fgetc(ent);

if( feof(ent) ) break;

fputc(c,sai);

}

fclose(ent);

fclose(sai);

(14)

Exercício

Com base no comando mycopy , crie o comando up , que converte um texto em maiúsculas.

use a macro toupper(), definida em ctype.h

(15)

Modo texto vs. modo binário

Armazenamento de números.

int n=12345;

texto: 5 bytes

binário: 2 bytes

Mudança de linha

texto: \n ↔ ↔ ↔ ↔ \n\r

binário: \n ↔ ↔ ↔ ↔ \n

Final de arquivo

texto: ASCII 26 (ou ^Z) ↔ ↔ ↔ ↔ EOF

(16)

Exemplo - criptografia “ingênua”

#include <stdio.h>

void main(int argc, char *argv[]) { FILE *e, *s;

char c;

if( argc!=3 ) {

puts("cript <origem> <destino>\n");

exit(1);

}

if( (e=fopen(argv[1],"rb"))==NULL ) { puts(”erro de abertura");

exit(2);

}

#include <stdio.h>

void main(int argc, char *argv[]) { FILE *e, *s;

char c;

if( argc!=3 ) {

puts("cript <origem> <destino>\n");

exit(1);

}

if( (e=fopen(argv[1],"rb"))==NULL ) { puts(”erro de abertura");

exit(2);

}

(17)

Exemplo - criptografia “ingênua”

if( (s=fopen(argv[2],"wb"))==NULL ) { puts(”erro de criação");

exit(3);

}

while(1) {

c = fgetc(e);

if( feof(e) ) break;

fputc( ~c, s);

}

fcloseall();

}

if( (s=fopen(argv[2],"wb"))==NULL ) { puts(”erro de criação");

exit(3);

}

while(1) {

c = fgetc(e);

if( feof(e) ) break;

fputc( ~c, s);

}

fcloseall();

}

(18)

Criptografia com chave

Criptografia

criptografar um texto T com uma chave C

T = 0x54 = 0101 0100 C = 0x43 = 0100 0011

0001 0111 = 0x17 =

^

(19)

Criptografia com chave

Decriptografia

decriptografar o código 0x17 com a chave C

0x17 = 0001 0111 C = 0x43 = 0100 0011

0101 0100 = 0x54 = T

^

(20)

Criptografia com chave

Fundamentos

Sejam t o texto, k a chave e c o código correspondente.

Criptografia...: (t^k) = c

Decriptografia..: c^k = t

Demonstração:

c^k = t

→ →

(t^k)^k = t

→ → →

t^(k^k) = t

→ →

t^0 = t

→ → →

t = t

(21)

Criptografia com chave

Idéia de implementação

texto.: UMA FRASE SECRETA

chave.: CHAVECHAVECHAVECH

código: ?????????????????

(22)

Criptografia com chave

#include <stdio.h>

void main(int argc, char *argv[]) { FILE *e, *s;

char t, c, *k;

if( argc!=4 ) {

puts("cript <org> <dst> <chave>");

exit(1);

}

if( (e=fopen(argv[1],"rb"))==NULL ) { puts(”erro de abertura");

exit(2);

}

#include <stdio.h>

void main(int argc, char *argv[]) { FILE *e, *s;

char t, c, *k;

if( argc!=4 ) {

puts("cript <org> <dst> <chave>");

exit(1);

}

if( (e=fopen(argv[1],"rb"))==NULL ) { puts(”erro de abertura");

exit(2);

}

(23)

Exemplo - criptografia “ingênua”

if( (s=fopen(argv[2],"wb"))==NULL ) { puts(”erro de criação");

exit(3);

}

k = argv[3];

while(1) {

t = fgetc(e);

if( feof(e) ) break;

fputc( t ^ *k++, s);

if( *k == ‘\0’) k=argv[3];

}

fcloseall();

if( (s=fopen(argv[2],"wb"))==NULL ) { puts(”erro de criação");

exit(3);

}

k = argv[3];

while(1) {

t = fgetc(e);

if( feof(e) ) break;

fputc( t ^ *k++, s);

if( *k == ‘\0’) k=argv[3];

}

fcloseall();

(24)

E/S formatada

Entrada

int n;

FILE *in = fopen(“val.dat”, “rt”);

fscanf(in, “%d”, &n);

Saída

int n;

FILE *out = fopen(“val.dat”, “wt”);

fprintf(out, “%d”, &n);

(25)

Exemplo - concurso

125 acbde 493 cdeaa 384 deabc 981 cadce 394 bbced 125 acbde 493 cdeaa 384 deabc 981 cadce

394 bbced 125 3

493 0 384 0 981 1 394 2 125 3 493 0 384 0 981 1 394 2

cand.dat

resultado Gabarito

abcde

(26)

Concurso - solução

#include <stdio.h>

void main(void) { FILE *e;

int i, insc, ptos;

char gab[6], resp[6];

if( (e=fopen("cand.dat","rt"))==NULL ) { puts(”erro de abertura");

exit(1);

}

printf("\nGabarito? ");

gets(gab);

#include <stdio.h>

void main(void) { FILE *e;

int i, insc, ptos;

char gab[6], resp[6];

if( (e=fopen("cand.dat","rt"))==NULL ) { puts(”erro de abertura");

exit(1);

}

printf("\nGabarito? ");

gets(gab);

(27)

Concurso - solução

while( 1 ) {

fscanf(e, "%d %s", &insc, resp);

if( feof(e) ) break;

ptos=0;

for(i=0; i<5; i++)

if( resp[i]==gab[i] ) ptos++;

printf("\n%d %d",insc,ptos);

}

fclose(e);

while( 1 ) {

fscanf(e, "%d %s", &insc, resp);

if( feof(e) ) break;

ptos=0;

for(i=0; i<5; i++)

if( resp[i]==gab[i] ) ptos++;

printf("\n%d %d",insc,ptos);

}

fclose(e);

(28)

Exercício

Modifique o programa do concurso para que a saída

seja enviada a um arquivo em disco (result.dat).

(29)

E/S binária

Entrada

int n[20];

FILE *in = fopen(“val.dat”, “rb”);

fread(n,sizeof(int),20,in);

Saída

float f;

FILE *out = fopen(“val.dat”, “wb”);

fwrite(&f,sizeof(float),1,out);

(30)

Exemplo - cadastro de funcionários

#include <stdio.h>

typedef struct { char nome[31];

float salario;

} Func;

void main(void) { FILE *s;

Func f;

if( (s=fopen("func.dat","wb"))==NULL ) { puts(”erro de abertura");

exit(1);

}

#include <stdio.h>

typedef struct { char nome[31];

float salario;

} Func;

void main(void) { FILE *s;

Func f;

if( (s=fopen("func.dat","wb"))==NULL ) { puts(”erro de abertura");

exit(1);

}

(31)

Exemplo - cadastro de funcionários

puts("Digite ponto para finalizar:\n");

while(1) {

printf("\nNome? ");

gets(f.nome);

if( !strcmp(f.nome,".") ) break;

printf("\nSalario? ");

scanf("%f%*c",&f.salario);

fwrite(&f,sizeof(Func),1,s);

}

fclose(s);

puts("Digite ponto para finalizar:\n");

while(1) {

printf("\nNome? ");

gets(f.nome);

if( !strcmp(f.nome,".") ) break;

printf("\nSalario? ");

scanf("%f%*c",&f.salario);

fwrite(&f,sizeof(Func),1,s);

}

fclose(s);

}

(32)

Exercício

Com base no programa de cadastramento

apresentado, crie um outro programa capaz de ler o

arquivo criado (func.dat) e apresentar seu conteúdo

no vídeo.

(33)

Fim

Referências

Documentos relacionados

A partir da década de 1980, as empresas passaram a medir desempenho em termos de criação de valor para o acionista. A ênfase na criação de valor levou ao desenvolvimento de várias

Com o consórcio, as vantagens são muitas: você produz alimentos enquanto o cajueiro não entra em produção; é mais fácil manter sem ervas daninhas a área entre as fileiras e entre

2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the

43 Art. Decorrido o prazo de um ano sem qualquer convocação do empregado pelo empregador, contado a partir da data da celebração do contrato, da última convocação ou do último dia

Para proteção dos organismos aquáticos, respeitar uma zona não pulverizada de 50 metros em relação às águas de superfície, incluindo 20 metros de coberto vegetal, em videira

ESCOLAS ESTADUAIS ENDEREÇOS BAIRRO

Se tiver quaisquer efeitos secundários, incluindo possíveis efeitos secundários não indicados neste folheto, fale com o seu médico ou farmacêutico. Também poderá comunicar

representação gráfica có rre go d o b aú SEDE CURRAL ENGENHO entrada açude GALINHEIRO açude 5 10 0 40 ANTIGA TULHA MOINHO ESTÁBULO pomar Implantação representação