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

Logo apó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
0 1 2
k-1 k k+1
n-1

arq
cursor
cópia de k bytes
fl

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)
0 1 2
k-1 k k+1
n-1

arq
cursor
fl

Com mais leituras e escritas, o cursor chega ao final de fl, mas
não de arq

arq continua desatualizado
0 1 2
k-1 k k+1
n-1

arq
cursor
fl

Para acesso ao próximo byte: o conteúdo de fl é copiado de
volta em arq, atualizando-o
0 1 2
k-1 k k+1
n-1

arq
cópia de k bytes
fl

Os próximos k bytes de arq são copiados em fl
0 1 2
k-1 k k+1
n-1

arq
O cursor vai
para o início
de fl, mas
não de arq
cursor
fl
cópia de k bytes

A execução de fclose copia fl de volta em arq, atualizando-o
0 1 2
k-1 k k+1
n-1

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)
Exemplo: seja o seguinte trecho de programa:
int a, b, soma, x, n; FILE *f1, *f2;
infile
soma = 0; n = 0;
1 12 43 21 67 23 74 23 10
f1 = fopen ("infile", "r");
f2 = fopen ("outfile", "w");
No vídeo
x = 2
x = fscanf(f1, "%d%d", &a, &b);
Encontrou
x = 2
printf ("x = %d\n", x);
final de arquivo
x = 2
x = 2
while (x > 0) {
x = 1
if (x == 2) {soma += a + b; n += 2;}
x = -1
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);
outfile
fclose (f1); fclose (f2);
A soma dos 9 numeros eh 274
Mudando o conteúdo de infile:
int a, b, soma, x, n; FILE *f1, *f2;
infile
soma = 0; n = 0;
1 12 43 21 67 23 74 23 10 #
f1 = fopen ("infile", "r");
f2 = fopen ("outfile", "w");
No vídeo
x = 2
x = fscanf(f1, "%d%d", &a, &b);
Não encontrou
x = 2
printf ("x = %d\n", x);
final de arquivo
x = 2
x = 2
while (x > 0) {
x = 1
if (x == 2) {soma += a + b; n += 2;}
x = 0
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);
outfile
fclose (f1); fclose (f2);
A soma dos 9 numeros eh 274
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ídeotexto 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
Exemplo: desenho de segmentos de retas com ‘*’
Limpa a tela:
#include <stdio.h>
conio2.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: ");
Na tela
getch (); return 0;
Sempre posiciona o cursor na
}
posição [a, b]
Inicialmente [a, b] = [1, 1]
A cada repetição a+=8 e b+=2
Exemplo: programa para o desenho de uma casa
Resultado no vídeo
#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:
Escreve 40 linhas
vazias com fundo
LIGHTRED
printf ("Maximize a tela e digite algo!");
getch ();
clrscr (); textcolor(BLUE); textbackground(LIGHTRED);
for (i = 1; i <= 40; i++)
printf ("
");
getch ();
80 espaços
Resultado:
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 Quartucci Forster
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
R-5-6
2) Fazer um programa que leia uma frase e a escreva no vídeográ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ídeográfico
Download

Capítulo V – Comandos de Entrada e Saída