Ir para o conteúdo

Manipulação de Ficheiros

Manipular ficheiros em C é bastante simples e envolve invariavelmente três fases:

  1. Abrir o ficheiro
  2. Ler e/ou escrever do/no ficheiro
  3. Fechar o ficheiro

Abrir um ficheiro

Para ler um ficheiro usa-se a função fopen(). Esta função recebe como parâmetros o nome do ficheiro e o modo de acesso e devolve um ponteiro do tipo FILE, em caso de erro a função retorna NULL.

Por exemplo:

FILE *fp; //inicialização do ponteiro
fp = fopen("ficheiro.txt", "r");

"r" é o modo de acesso e significa que o ficheiro é aberto apenas para leitura (read). Caso se pretenda abrir o ficheiro para escrita seria utilizada a etiqueta "w" em vez de "r". Os seguintes modos de acesso podem ser utilizados:

Modos de acesso Descrição
r abre o ficheiro para leitura
w Abre o ficheiro para escrita
a Abre o ficheiro para adição de conteúdo no final do ficheiro
r+ Abre o ficheiro para leitura e escrita, coloca o ponteiro no início
w+ Abre o ficheiro para escrita em sobreposição com o conteúdo existente
a+ Abre o ficheiro para leitura e escrita, adiciona conteúdo no final do ficheiro caso este exista

Podemos acrescentar um b para assim podermos aceder a ficheiros binários. Por exemplo:

fp=fopen("Ficheiro.dat","rb");

Podemos ainda melhorar o nosso código para detectar erros na abertura do ficheiro.

FILE *fp;

if((fp=fopen("Ficheiro.txt","r"))==NULL)
    printf("Impossível abrir o ficheiro pretendido!");

Fechar um ficheiro

Por norma quando fechamos um programa a ligação que existe com o nosso ficheiro e o nosso programa, mas é bom método de programação retirar a ligação que existe, com o seguinte função.

fclose(*fp);

Para poupar um bocado do nosso esforço, se tivermos muito ficheiros abertos podemos encurtar o processo fazendo:

fcloseall();

Ler e escrever num ficheiro

Modo Texto

Serão apresentadas as funções mais usadas na Leitura e na Escrita em ficheiro abertos em modo de texto.

fgetc

Leitura carácter a carácter do ficheiro

int fgetc(Ficheiro);
while((fgetc(fp))!=EOF)  /* Precisa de um ciclo visto que a função lê carácter a carácter */
    putchar(ch);
fgets

Leitura linha a linha de um ficheiro. Esta função precisa de uma string

char *fgets(char *x, int y, FILE *fp)

Onde: char *s é a string onde vai ser guardada a linha do ficheiro int y marca o limite que vai ser possível guardar na string para assim evitar buffer overflow FILE *fp é onde a função vai buscar os valores

Nota: A função retorna NULL em cada de EOF ou erro

char x[1000];
FILE *fp;
/* O resto do codigo */



while(fgets(x,1000,fp)!=NULL) /* Se tiver mais que uma linha */
    printf("%s",n);
fscanf

Leitura formatada

int fscanf(FILE *fp, const char *format ...)
while(fscanf(fp,"%c"&ch)!=EOF)  /*Novamente carácter a carácter, mas também podemos usar para extrair strings */
    printf("%c",c);
fputs

Escrita num Ficheiro. Esta função retorna EOF em caso de erro

int fputs(int ch, FILE *fp)
while((ch=fgetc(fp))!=EOF)
    fputs(ch,stdout);
fprintf

Escrita em Ficheiro Formatada.

int fprintf(FILE *fp, const char *format)
while((ch=fgetc(ch))!=EOF)
    printf(stdout,"%c",fp);

Modo Binario

fwrite

Escrita para o Disco, a função retorna os valores que conseguiu guardar em caso de erro!

 int fwrite(const void *ptr, int size, int n, FILE *fp) 

Onde: const void *ptr : Este apontador tem que apontar para o endereço de memoria que queremos guardar, e é void pois é um apontador que pode apontador para qualquer tipo int size : Indica o tamanho int n : Indica o numero elementos que queremos escrever FILE *fp : o ficheiro onde vamos guardar a informação

FILE *fp;
int x[10];

/* Resto do código  */

if(fwrite(x,sizeof(int),10,fp)!=10); /* Se a função não retornar 10 é porque houve algum problema */
    printf("Não foi possível guardar todos os dados para o ficheiro!\n");
fread

Leitura de dados a partir do ficheiro, a função retorna o numero que conseguiu ler em caso de erro!

 int fread(const void *ptr, int size, int n, FILE *fp)

Onde: const void *ptr : Este apontador tem que apontar para o endereço de memoria que queremos guardar, e é void pois é um apontador que pode apontador para qualquer tipo int size : Indica o tamanho int n : Indica o numero elementos que queremos escrever FILE *fp : o ficheiro onde vamos guardar a informação

FILE *fp;
int x[10];

/*Resto do Código */

if((fread(x,sizeof(int),10,fp))!=10) /* Os valores serão guardados numa string */
    printf("Não foi possível ler todos os resultados")

Posicionamento no Ficheiro

Imagine mos que temos que ir ate a ultima linha do nosso ficheiro, podemos fazer pelo Acesso Sequencial indo linha a linha ate a ultima, mas temos uma forma muito mais rápida de conseguirmos o mesmo resultado, esse método chama se Acesso Directo.

fseek

Esta é a função que usamos para nos posicionarmos no ficheiro, a função devolve 0 em caso de erro, e um valor diferente de 0 em caso de sucesso

 int fseek (FILE *fp, long offset, int origin) 

Onde:

FILE *fp : é o ficheiro onde nos queremos posicionar long offset : Indica o numero de bytes que queremos andar (Positivo anda para a frente, Negativo anda para trás ) int origin : Indica de que ponte inicial nos queremos iniciar o posicionamento

Constante Valor Significado
SEEK_SET 0 A partir do Inicio do ficheiro
SEEK_CUR 1 A partir da posição actual no ficheiro
SEEK_END 2 A partir do final do ficheiro
fseek(fp,0L,SEEK_END); /* Assim ficamos no fim do ficheiro */
ftell

Funçao que nos devolve a posição actual no ficheiro

long ftell (FILE *fp)
rewind

Coloca o Ponteiro no inicio do ficheiro

 rewind(fp) 

Detençao de End-of-File

Como já sabemos um recebemos EOF quando chegamos ao final de um ficheiro.

int feof (FILE *fp)

Exemplo:

while(!feof(fp)) */*Enquanto que nao receber EOF executa */
 /* Resto do codigo */