Aula 18
Nota. A matéria relativa a ficheiros não vem para exame
mas pode interessar aos alunos. Ver também os "slides" em
"Alguns apontamentos...!".
Nota. no fundo desta página indicam-se soluções possíveis para alguns
dos problemas propostos.
---------------------------
Uso sequêncial de ficheiros
Exercícios de revisão
---------------------------
declarar / abrir / fechar / ler de / escrever em / posicionar
----------------
Declarar e abrir
----------------
FILE * f; <------------------ declarar
f1 = fopen("teste.c","r"); <------------------ abrir
if(f1==NULL){
printf("Erro de ficheiro\n");
exit(0);
}
fopen("teste.c","r");
^ ^
| |
nome modo
nome: por exemplo "/etc/fstab"
modo: "r", "w", ...
Nota. Ao abrir em modo "w" o ficheiro, se existir é apagado
------
Fechar
------
fclose(f1);
Ao terminar o programa os ficheiros abertos são automaticamente
fechados.
Mas é má prática não fechar os ficheiros quando já não são
necessários.
--------------------
Ler de / escrever em
--------------------
Ler um caracter
FILE *f;
f=fopen...
int c;
c=getc(f);
if(c==EOF)
...
Escrever um caracter
FILE *f;
f=fopen...
putc(f,'o');
...
getc(stdin) = getchar(stdin)
putc(stdout,c) = putchar(c)
Leitura e escrita formatada
---------------------------
fscanf(f,"...",..., ..., ...)
fprintf(f,"...",..., ..., ...)
f: (descritor) do ficheiro
"...": formato
etc.
scanf <--> sscanf <--> fscanf
printf <--> sprintf <--> fprintf
---------
Exercício
---------
Escreva um comando diferencas (programa em C...) que seja chamado
diferencas fich1 fich2
e imprima "iguais" ou "diferentes" consoante os conteúdos dos
ficheiros sejam iguais ou não respectivamente.
Estrutura do programa
#include <stdio.h>
//-- retorna 1 se ficheiros diferentes, 0 se iguais
int diferem(FILE *f,FILE *g){
ESCREVA ESTA FUNÇÃO
...
}
//--------------------------------------------
void erro(char m[]){
printf("** %s\n",m);
exit(0);
}
//--------------------------------------------
int main(int np, char *par[]){
FILE *ficha, *fichb;
if(np!=3)
erro("Numero de parametros errado");
if((ficha=fopen(par[1],"r"))==NULL ||
(fichb=fopen(par[2],"r"))==NULL)
erro("Erro de ficheiros");
if(diferem(ficha,fichb))
printf("%s e %s são diferentes\n",par[1],par[2]);
else
printf("%s e %s são iguais\n",par[1],par[2]);
return 0;
}
---------
Exercício
---------
Escreva um comando copia (programa em C...) que seja chamado da forma
copia fich1 fich2
e que copie o ficheiro com o nome fich1 para o ficheiro com o nome
fich2.
Se não existia, fich2 passa a existir; se existia é "destruído.
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
Exemplo de perguntas possíveis no teste
°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
1-----------------------------------
A instrução v[--i]=v[--i]; é equivalente a
1. i--; i--; v[i-1]=v[i-2];
2. i-=2;
3. etc
2------------------------------------
O que escreve o seguinte programa?
void gluglu(int n,int v[]){
int i,x;
x=v[n-1];
for(i=n-1;i>=1;i--)
if(v[i]>x) x=v[i];
for(i=n-1;i>=1;i--)
if(v[i]+v[i-1]==10)
v[i]=x;
}
main(){
int i, v[]={8,2,5,1,9};
gluglu(5,v);
for(i=0;i<5;i++)
printf("%3d",v[i]);
}
2------------------------------------
O que escreve o seguinte programa?
main(){
char v[]="bolotas e bolos";
int i;
for(i=1;v[i-1]!=0 && v[i]!=0;i+=2)
v[i]='a';
printf("%s",v);
return 0;
}
1. balatasaeabalas
2. balatas e balas
3. bolotos e balas
4. bolotas e bolas
5. bolotosoeobolos
6. aaaaaaaaaaaaaaa
===================================================================
Conhecer a sintaxe e a semântica do C (dada nas aulas), como
* Instrução break, switch
* Expressão condicional, E?F:G;
* Operadores pós/pré incremento/decremento (como em v[++i]=5;)
* #define com parâmetros
* Definição e uso (no cabeçalho das funções e sua chamada) de
vectores.
* Representação e o uso de "strings"
PC/PI - página reservada - versão 2005.02.08