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