Manipulação de Ficheiros
Manipular ficheiros em C é bastante simples e envolve invariavelmente três fases:
- Abrir o ficheiro
- Ler e/ou escrever do/no ficheiro
- 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 (r
ead). 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 */