Aulas teóricas - notas...Aula 17Aula 18

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"
  • Copia um ficheiro para outro, semelhante ao comando cp
  • Os 2 ficheiros são diferentes?

  • PC/PI - página reservada - versão 2005.02.08

    Aulas teóricas - notas...Aula 17Aula 18