430 likes | 528 Views
Capítulo V – Comandos de Entrada e Saída. 5.1 – Equipamentos de entrada e saída 5.2 – Saída no vídeo-texto 5.3 – Entrada pelo teclado 5.4 – Entrada e saída por arquivos em disco 5.5 – Controle do vídeo-texto 5.6 – Vídeo-gráfico. 5.4 – Entrada e Saída por Arquivos em Disco.
E N D
Capítulo V – Comandos de Entrada e Saída 5.1 – Equipamentos de entrada e saída 5.2 – Saída no vídeo-texto 5.3 – Entrada pelo teclado 5.4 – Entrada e saída por arquivos em disco 5.5 – Controle do vídeo-texto 5.6 – Vídeo-gráfico
5.4 – Entrada e Saída por Arquivos em Disco 5.4.1 – Arquivos-textos e arquivos binários • Arquivos: regiões contíguas na memória secundária, dos mais diversos tamanhos, destinadas cada uma a guardar informações correlatas, usadas para um determinado fim • Existem arquivos de programas, arquivos de dados, arquivos de imagens, arquivos com som digitalizado, etc.
A Linguagem C trabalha com dois tipos de arquivos: • Arquivos-textos: • Seu conteúdo pode ser encarado como uma sequência linear de caracteres • Arquivos de programas são arquivos-textos • Alguns arquivos de dados também são • Arquivos binários: • Podem conter números inteiros e reais em binário, textos, imagens, etc.
Arquivos binários: • Tipicamente são sequências lineares de estruturas de mesmo tipo • Estruturas serão vistas em capítulo específico • Arquivos binários não serão estudados em CES-10 • Arquivos-textos: • São os arquivos abordados neste tópico
Nos arquivos-textos, existe uma divisão em linhas proporcionada pelos caracteres ‘\n’ (new line) • Cada um desses caracteres é uma marca de final de linha • As linhas não têm necessariamente o mesmo número de caracteres • Linhas vazias são caracterizadas por conterem apenas o ‘\n’ e nada mais
5.4.2 – Abertura e fechamento de arquivos-textos • Dados de entrada para programas podem ser retirados de arquivos, em vez de serem digitados por meio do teclado • Resultados de um programa podem ser gravados num arquivo, em vez de aparecerem no vídeo • Todo arquivo da memória secundária precisa ser associado a uma variável do tipo FILE de um programa, para ser acessado por esse programa
Abertura de um arquivo: ato de associar um arquivo do disco a uma variável do tipo FILE • Em C, essa abertura é feita pela função fopen, pertencente ao arquivo stdio.h • Exemplo: seja o seguinte trecho de programa: FILE *ff; ff = fopen ("C:\\ces10\\programas\\dados", "r"); • O arquivo dados, localizado na sub-pasta programas da pasta ces10 do diretório C, será aberto somente para leituras
FILE *ff; ff = fopen ("C:\\ces10\\programas\\dados", "r"); • O arquivo dados fica associado à variável ff, ou seja, tudo o que for realizado em ff será feito no arquivo dados • Se o arquivo a ser aberto estiver na mesma pasta que contém o arquivo do programa que o acessará, apenas o nome do arquivo é necessário: • Não é necessário informar a localização do arquivo: ff = fopen ("dados", "r");
FILE *ff; ff = fopen ("C:\\ces10\\programas\\dados", "r"); • Na declaração de toda variável do tipo FILE,o asterisco ‘*’ deve ser colocado antes do seu nome • Isso é uma característica das variáveis do tipo ponteiro, que serão estudadas em capítulo específico • Variável do tipo FILE é um ponteiro que guarda o endereço da região de memória para ela reservada
Modos de abertura de arquivos-textos: • A abertura só para leitura ou para leitura inicial de um arquivo não existente falhará • fopen retornará um valor a ser interpretado como abertura mal-sucedida
Modos de abertura de arquivos-textos: • Abertura só para escrita ou para escrita inicial: • Se o arquivo não existir: provocará sua criação • Se o arquivo já existir:apagará todo o seu conteúdo, reinicializando-o
Modos de abertura de arquivos-textos: • Abertura para aumentar a partir do final: • Se o arquivo não existir: provocará sua criação • Se o arquivo já existir: tudo será escrito a partir de seu final Em CES-10 só serão abordados os modos “r” e “w”
Uma variável do tipo FILE ocupa um espaço de vários bytes na memória principal • Num dado momento da execução do programa, apenas um desses bytes pode ser acessado • Diz-se que existe um cursor posicionado nesse byte • O cursor pode se movimentar ao longo dessa variável ou arquivo, mediante chamadas de funções para leitura ou escrita
Ao se encerrarem as operações em um arquivo-texto, deve-se nele executar a operação de fechamento • A associação estabelecida por fopen é então desfeita • A função fclose, pertencente também ao arquivo stdio.h, realiza essa operação • Exemplo: fclose (ff) • O fechamento de um arquivo garante que todas as alterações realizadas na variável a ele associada redundem também em alterações nele próprio
Exemplo: seja arq um arquivo de n bytes do diretório do usuário • Seja o seguinte trecho de programa em C: FILE *fl; fl = fopen (“arq”, “r+”); • Seja também k < n o número de bytes de fl • Ou seja, arq não cabe em fl • A seguir um esquema de troca de conteúdo entre arq e fl
0 1 2 k-1 k k+1 n-1 • Logoapós a execução de fopen: os k 1os bytes de arq são copiados em fl • O cursor do arquivo é posicionado em seu início arq cursor cópia de k bytes fl
0 1 2 k-1 k k+1 n-1 • Após algumas leituras e escritas, o cursor se movimenta para frente • As leituras e escritas são feitas apenas em fl (arq fica desatualizado) arq cursor fl
0 1 2 k-1 k k+1 n-1 • Com mais leituras e escritas, o cursor chega ao final de fl, mas não de arq • arqcontinua desatualizado arq cursor fl
0 1 2 k-1 k k+1 n-1 • Para acesso ao próximo byte: o conteúdo de fl é copiado de volta em arq, atualizando-o arq cópia de k bytes fl
0 1 2 k-1 k k+1 n-1 • Os próximos k bytes de arq são copiados em fl arq O cursor vai para o início de fl, mas não de arq cursor cópia de k bytes fl
0 1 2 k-1 k k+1 n-1 • A execução de fclose copia fl de volta em arq, atualizando-o arq cópia de k bytes fl
5.4.3 – Leitura e escrita em arquivos-textos • Em C, a leitura e a escrita em arquivos-textos é feita respectivamente pelas funções fscanf e fprintf, também pertencentes ao arquivo stdio.h • Formas gerais: fscanf (Variavel, CadeiaDeControle, OutrosArgumentos); fprintf (Variavel, CadeiaDeControle, OutrosArgumentos);
fscanf (Variavel, CadeiaDeControle, OutrosArgumentos); fprintf (Variavel, CadeiaDeControle, OutrosArgumentos); • CadeiaDeControle e OutrosArgumentos têm o mesmo significado visto para as funções scanf e printf • Variavel é o nome da variável do tipo FILE associada ao arquivo que sofrerá as operações de leitura e/ou escrita
fscanf (Variavel, CadeiaDeControle, OutrosArgumentos); fprintf (Variavel, CadeiaDeControle, OutrosArgumentos); • O valor retornado pelas funções fscanf e fprintfé o mesmo retornado pelas funções scanf e printf • fscanf pode ser usada como um detector de final de arquivo • Quando fscanf encontra e lê a marca de final de arquivo, ela retorna -1 (menos 1)
infile No vídeo outfile A soma dos 9 numeros eh 274 1 12 43 21 67 23 74 23 10 x = 2 x = 2 x = 2 x = 2 x = 1 x = -1 Exemplo: seja o seguinte trecho de programa: int a, b, soma, x, n; FILE *f1, *f2; soma = 0; n = 0; f1 = fopen ("infile", "r"); f2 = fopen ("outfile", "w"); x = fscanf(f1, "%d%d", &a, &b); printf ("x = %d\n", x); while (x > 0) { if (x == 2) {soma += a + b; n += 2;} else {soma += a; n++;} x = fscanf(f1, "%d%d", &a, &b); printf ("x = %d\n", x); } fprintf (f2, "A soma dos %d numeros eh %d", n, soma); fclose (f1); fclose (f2); Encontrou final de arquivo
infile No vídeo outfile A soma dos 9 numeros eh 274 1 12 43 21 67 23 74 23 10 # x = 2 x = 2 x = 2 x = 2 x = 1 x = 0 Mudando o conteúdo de infile: int a, b, soma, x, n; FILE *f1, *f2; soma = 0; n = 0; f1 = fopen ("infile", "r"); f2 = fopen ("outfile", "w"); x = fscanf(f1, "%d%d", &a, &b); printf ("x = %d\n", x); while (x > 0) { if (x == 2) {soma += a + b; n += 2;} else {soma += a; n++;} x = fscanf(f1, "%d%d", &a, &b); printf ("x = %d\n", x); } fprintf (f2, "A soma dos %d numeros eh %d", n, soma); fclose (f1); fclose (f2); Não encontrou final de arquivo
Exercícios 5.4: 1) Fazer um programa para: • Ler o nome de um arquivo existente no diretório desse programa (leitura de cadeia de caracteres - próximo capítulo) • Produzir um outro arquivo contendo as linhas do arquivo lido numeradas É interessante ler um arquivo contendo um programa, para que se obtenha a numeração de suas linhas
Capítulo V – Comandos de Entrada e Saída 5.1 – Equipamentos de entrada e saída 5.2 – Saída no vídeo-texto 5.3 – Entrada pelo teclado 5.4 – Entrada e saída por arquivos em disco 5.5 – Controle do vídeo-texto 5.6 – Vídeo-gráfico
5.5 – Controle do Vídeo-Texto 5.5.1 – A função gotoxy • Vista nas aulas de lab, gotoxy posiciona o cursor do vídeo-texto na posição dada por seus argumentos • Forma geral: gotoxy (expressão1, expressão2) No da coluna No da linha
5.5 – Controle do Vídeo-Texto 5.5.1 – A função gotoxy • Para ser usada no CodeBlocks, gotoxy pertence à biblioteca conio2 (arquivos <conio2.h> e <libconio.a>) • Esses dois arquivos deverão ser copiados respectivamente para as pastas include e lib, de CodeBlocks\MinGW • Instruções de como configurar o CodeBlocks para trabalhar com a biblioteca conio2 são apresentadas nas aulas práticas
Limpa a tela: conio2.h Exemplo: desenho de segmentos de retas com ‘*’ #include <stdio.h> #include <conio.h> #include <conio2.h> int main () { int a, b, i; printf ("Maximize a tela e digite algo!"); getch (); clrscr (); for (a=1, b=1, i=1; i<=10; a+=8, b+=2, i++) { gotoxy (a, b); printf ("********"); } printf ("\n\nDigite algo para encerrar: "); getch (); return 0; } Na tela Sempre posiciona o cursor na posição [a, b] Inicialmente [a, b] = [1, 1] A cada repetição a+=8 e b+=2
Resultado no vídeo Exemplo: programa para o desenho de uma casa
#include <stdio.h> #include <conio.h> #include <conio2.h> int main () { int i,j,x,y,z; printf ("Maximize a tela e digite algo!"); getch (); clrscr (); /* Desenho do telhado */ for (x=10,y=12,z=40,i=1; i<=7; x+=3,y-=1,z-=6,i++) { gotoxy (x,y); printf ("%s%*s","////",z,"\\\\\\\\"); } gotoxy (x,y); printf ("/\\");
/* Desenho do piso: coordenada inicial (17, 19); Comprimento 30 */ x=17; y=19; gotoxy (x,y); printf ("##############################"); /* Desenho das paredes: altura 8; intervalo 28 */ for (y--,i=1;i<=8;y--,i++) { gotoxy (x,y); printf ("%c%29c",'#', '#'); }
/* Desenho da janela e da porta: janela: 8x3; porta: 5x6 */ for (x=22,y=13,i=1;i<=3;y++,i++){ gotoxy (x,y); printf ("########"); } for (x=38,y=13,i=1;i<=6;y++,i++){ gotoxy (x,y); printf ("#####"); }
/* Desenho da chamine: */ x=40; y=4; gotoxy (x,y); printf ("###"); for (y++,i=1;i<=3;y++,i++){ gotoxy (x,y); printf ("%c%2c",'#','#'); } x=42; gotoxy (x,y); printf ("%c",'#'); /* Fechamento da tela */ gotoxy (1, 23); printf ("Digite algo para encerrar: "); getch (); return 0; }
5.5.2 – Outras funções do conio2.h • textbackground: estabelece a cor de fundo de um texto escrito • textcolor: estabelece a cor do texto • Exemplo: no programa da casinha: printf ("Maximize a tela e digite algo!"); getch (); clrscr (); textcolor(BLUE); textbackground(LIGHTRED); for (i = 1; i <= 40; i++) printf (" "); getch (); Escreve 40 linhas vazias com fundo LIGHTRED 80 espaços
Capítulo V – Comandos de Entrada e Saída 5.1 – Equipamentos de entrada e saída 5.2 – Saída no vídeo-texto 5.3 – Entrada pelo teclado 5.4 – Entrada e saída por arquivos em disco 5.5 – Controle do vídeo-texto 5.6 – Vídeo-gráfico
5.6 – Vídeo-Gráfico • Visto nas aulas de laboratório • No CodeBlocks são usadas rotinas gráficas desenvolvidas pelo Prof. Carlos Henrique QuartucciForster
Exercícios 5.6: 1) Seja um tabuleiro de xadrez e as peças Rainha, Torre, Bispo e Cavalo. Fazer um programa que leia a inicial de várias dessas peças e as coordenadas de cada uma dentro do tabuleiro e, para cada peça em separado, desenhe no vídeo-texto e no vídeo-gráfico o tabuleiro mostrando a posição da peça, as casas atacadas por ela e as casas livres de seu ataque. Ver exemplos no próximo slide
2) Fazer umprograma que leia uma frase e a escreva no vídeo-gráfico, de modo que cada caractere da frase ocupe um retângulo de 33x21 pixels 3) Desenhar a Bandeira do Brasil no vídeo-texto e no vídeo-gráfico