Você está na página 1de 5

AGRUPAMENTO DE ESCOLAS DE SANTA COMBA DO

CURSO PROFISSIONAL DE TCNICO DE GESTO E PROGRAMAO DE SISTEMAS


INFORMTICOS
2012-2015
PROGRAMAO E SISTEMAS DE INFORMAO

MDULO 7 Tratamento de Ficheiros (40 aulas/45min)

Objetivos do mdulo:

- Conhecer as regras de declarao de ficheiros;

- Identificar as operaes definidas para a manipulao de ficheiros;

- Dominar tcnicas de processamento de ficheiros;

- Elaborar programas que recorram a ficheiros como suporte de dados;

- Conhecer as operaes especficas para manipular ficheiros de texto;

- Dominar as tcnicas de processamento de ficheiros de texto;

- Elaborar programas que recorram a ficheiros de texto como suporte de dados;

- Ser capaz de tornar persistente a informao necessria a execuo do programa.

Contedos do mdulo:

- Conceitos gerais;

- Criao de ficheiros de dados e de texto;

- Instrues de controlo de ficheiros;

- Manipulao de informao em ficheiros;

- Manipulao de ficheiros com recurso a estruturas dinmicas.

Definio

As estruturas de dados estudadas at este mdulo tm em comum o facto de serem volteis, ou seja, os dados que
contm perdem-se quando a corrente eltrica desligada.

Esta limitao resolvida com o sistema de ficheiros, o sistema operativo organiza o espao dos dispositivos de
armazenamento externos ou secundrios atravs de um sistema de ficheiros baseado no princpio real de um
armrio com vrias gavetas que podem organizar diferentes ficheiros dentro delas.

Neste sistema cada ficheiro possui alguns atributos que podem variar de sistema de ficheiros para sistema de
ficheiros bem como em diferentes sistemas operativos. Alguns desses atributos so:

- Nome

- Identificador

- Tamanho

alunosnet@gmail.com alunosnet.pt.vu Pgina 1 de 5


- Data e hora de criao

- Data e hora de modificao

- Proteo ou direitos de acesso

Os ficheiros podem ser de dois grandes tipos: dados e executveis.

Os ficheiros executveis so aplicaes que o sistema operativo executa.

Os ficheiros de dados so os documentos criados pelas aplicaes: textos, imagens, vdeos, sons, bases de dados,
pginas web, etc.

Criao de ficheiros

O processo de criar um ficheiro passa por estabelecer uma ligao entre uma varivel interna do programa e um
ficheiro num determinado dispositivo.

Para isso temos de criar um ponteiro do tipo FILE.

FILE *ficheiro;

Este ponteiro utilizado no cdigo sempre que alguma instruo se refira ao ficheiro.

O passo seguinte criar ou abrir o ficheiro caso ele j exista, para isso temos a funo fopen.

FILE *fopen(const char *nomeFicheiro, const char *modo)

Esta funo recebe dois parmetros, o primeiro o nome do ficheiro e o segundo modo de acesso pretendido ao
ficheiro. Caso no seja possvel abrir ou criar o ficheiro o ponteiro devolvido pela funo fica a NULL.

O nome do ficheiro pode incluir a pasta onde este se localiza, para isso, no caso de ser necessrio utilizar o carater
separador das pastas \ e porque essa barra pode ser utilizada para os carateres especiais como o \n devem ser
utilizadas sempre duas barras \\.

Os modos de acesso so definidos atravs da combinao de letras cujo significado apresentado na seguinte tabela
(utilizar sempre minsculas):

r Acesso somente para leitura (caso o ficheiro no exista o ponteiro fica a NULL)
w Acesso para escrita (caso no exista o ficheiro criado, caso exista o ficheiro destrudo)
a Acesso para adicionar (caso no exista o ficheiro criado)
r+ Acesso para leitura e escrita (comea pelo inicio)
w+ Acesso para leitura e escrita (caso no exista o ficheiro criado, caso exista o ficheiro
destrudo)
a+ Acesso para leitura e escrita (caso no exista o ficheiro criado)
b Acesso em modo binrio

Exemplo de abertura de um ficheiro de texto para leitura:


FILE *ficheiro;

ficheiro=fopen(c:\\teste.txt,r);

alunosnet@gmail.com alunosnet.pt.vu Pgina 2 de 5


Sempre que abrimos um ficheiro devemos fecha-lo:

int fclose(FILE *ficheiro);

A funo devolve 0 se o ficheiro foi fechado com sucesso.

FILE *ficheiro;

ficheiro=fopen(c:\\teste.txt,r);

//funes de acesso ao ficheiro

fclose(ficheiro);

Um programa pode ter vrios ficheiros abertos em simultneo desde que associe diferentes ponteiros a cada um.

Ler e escrever num ficheiro de texto

Para ler e escrever num ficheiro de texto existem diversas funes sendo as mais simples as funes fprintf e fscanf
que, como o nome deixa antever, so o equivalente ao printf e scanf.

Exemplo:

FILE *ficheiro;

ficheiro=fopen(c:\\teste.txt,w);

fprintf(ficheiro,Ol mundo\n);

fclose(ficheiro);

(ver m7_exemplo1.cpp)

Com a funo fputc podemos escrever letra a letra:

int fputc(int c,FILE *fp);

Quando falha a gravao a funo devolve EOF seno devolve c (ou seja o mesmo valor que recebe no primeiro
parmetro).

(ver m7_exemplo2.cpp)

Existe ainda a funo puts:

int fputs(const char *s,FILE *fp);


Com a funo fscanf podemos fazer a leitura do ficheiro tal como se se tratasse do teclado.
FILE *ficheiro;
char texto[80];
ficheiro=fopen(c:\\teste.txt,r);
fscanf(ficheiro,%s,texto);
printf(%s\n,texto);
fclose(ficheiro);

alunosnet@gmail.com alunosnet.pt.vu Pgina 3 de 5


A funo fscanf devolve o nmero de elementos efetivamente lidos do ficheiro.

Para alm desta funo temos fgetc para ler letra a letra e ainda fgets para ler linhas inteiras do ficheiro.

int fgetc(FILE *fp);

int fgets(char *buffer,int n,FILE *fp);


(ver m7_exemplo3.cpp, m7_exemplo4.cpp e m7_exemplo5.cpp)

A funo fgets l n-1 carateres e acrescenta \0 no final da string. Se a funo encontrar uma quebra de linha (\n) ou o
fim do ficheiro (EOF) termina a leitura antes de ler os n-1 carateres. Ao contrrio da funo fscanf l os espaos em
branco sem quebras ou divises.

Para ler um ficheiro at ao fim utilizamos a funo feof(FILE *ficheiro) que permite avaliar se o final do ficheiro foi ou
no atingido. Esta funo s devolve verdadeiro quando a leitura falhou devido a no haver mais dados.

No esquecer que para adicionar texto ao ficheiro necessrio abrir com modo de acesso correto.

(ver m7_exemplo6.cpp e m7_exemplo7.cpp)

Estas funes permitem ler e escrever em ficheiros de texto, isto quer dizer que todas as operaes de escrita e
leitura sofrem converses como por exemplo os carateres especiais \n so convertidos em quebras de linha, \t em
tabulaes, bem como os dados gravados so sempre convertidos em carateres da tabela ASCII, sejam letras ou
nmeros.

Os ficheiros de texto so teis para guardar pequenos textos sem configurao ou formatao mas, para dados mais
complexos, como dados multimdia (imagens, vdeo ou som) ou bases de dados no podem ser utilizados, para isso
temos os ficheiros binrios.

As operaes de leitura e gravao num ficheiro binrio so feitas sem qualquer converso, os dados so gravados
no seu formato original sem converso para o respetivo carater ASCII, por exemplo quando se grava um valor
numrico num ficheiro de texto este convertido no respetivo carater da tabela ASCII ao contrrio dos ficheiros
binrios que registam o valor binrio do nmero.

Ler e escrever ficheiros binrios

Para ler de ficheiros binrios temos a funo fread:

size_t fread(void *ptr, size_t tamanho, size_t n_elementos, FILE *ficheiro)

A funo devolve o tamanho, em bytes, dos dados efetivamente lidos.

Para escrever em ficheiros binrios temos a funo fwrite:

size_t fwrite(void *ptr, size_t tamanho, size_t n_elementos, FILE *ficheiro)

(ver m7_exemplo8.cpp e m7_exemplo9.cpp)

Durante o processo de escrita e leitura o ficheiro mantm um cursor que indica a posio dentro do ficheiro, este
cursor indica onde a prxima operao de leitura ou escrita vai ocorrer dentro do ficheiro.

Para reposicionar o cursor podemos utilizar a funo fseek:

int fseek(FILE *ficheiro,long int deslocamento,int origem)

alunosnet@gmail.com alunosnet.pt.vu Pgina 4 de 5


O cursor reposicionado para o deslocamento a partir da origem, que pode ser:

SEEK_SET Deslocamento a partir do incio do ficheiro


SEEK_CUR Deslocamento a partir da posio atual
SEEK_END Deslocamento a partir do fim do ficheiro
Devolve 0 se a operao decorreu com sucesso.

Assim podemos reposicionar no incio do ficheiro:


fseek(ficheiro,0,SEEK_SET);
No final do ficheiro:
fseek(ficheiro,0,SEEK_END);
Avanar um inteiro para a frente:
fseek(ficheiro,sizeof(int),SEEK_CUR);
Retrocede um inteiro:
fseek(ficheiro,sizeof(int)*(-1),SEEK_CUR);
(ver m7_exemplo10.cpp)

A funo ftell devolve a posio do cursor dentro do ficheiro:

long int ftell(FILE *ficheiro)

Estas duas funes no devem ser utilizadas com ficheiros de texto pois o seu comportamento no o mesmo tendo
em conta as converses feitas nesse tipo de ficheiros.

Quando executamos uma operao de escrita num ficheiro os dados no so imediatamente escritos, na realidade
estes so enviados para uma memria intermdia (buffer) de onde so descarregados para o ficheiro quando este
buffer estiver cheio.

Para garantir que os dados so efetivamente gravados no ficheiro podemos utilizar a funo fflush:

int fflush(FILE *ficheiro)

Estas funes so utilizadas para guardar vetores completos com uma s linha de cdigo e podem tambm ser
utilizadas com estruturas para criar ficheiros de dados.

Apagar ficheiros:

int remove(const char *ficheiro) apaga o ficheiro e devolve zero se conseguiu remover.

Mudar nome:

int rename(const char *antigo, const char *novo) muda o nome do ficheiro ou pasta, devolve zero se conseguiu.

Fontes:

https://pt.wikipedia.org/wiki/Sistema_de_ficheiros
www.cprogramming.com/tutorial/cfileio.html
http://www.tutorialspoint.com/cprogramming/c_file_io.htm
www.dirac.org/linux/programming/tutorials/files_in_C/
www.cs.bu.edu/teaching/c/file-io/intro/
www.cplusplus.com

alunosnet@gmail.com alunosnet.pt.vu Pgina 5 de 5