Biblioteca stdio
Um ficheiro na biblioteca stdlib é designado por “stream” e é descrito por um apontador para o tipo FILE, designado por file pointer. O tipo FILE está definido no stdio.h. Existem três file pointers pré-definidos correspondentes aos fds 0, 1, 2:
stdin: standard fd para entrada
stdout: standard fd para saída
stderr: standard fd para erros
A biblioteca stdio tem vantagens comparada com chamadas directas ao SO. Ela permite usar o código em SOs diferentes sem nos preocuparmos com portabilidade.
Abrir ficheiro
A função fopen() esta incluída em stdio.h e é usada para abrir um ficheiro num determinado modo (escrita, leitura, etc.).
FILE *fopen(const char *filename, const char *mode);
Parameters:
filename → nome do ficheiro a abrir
mode → modo de acesso (por exemplo “r”, “w”, “a”, “r+”, “w+”, “a+”)
Esta função retorna ponteiro para FILE se tudo correr bem ou então NULL (caso de erro).
Fechar ficheiro
A função fclose() é usada para fechar um ficheiro previamente aberto com fopen().
Quando um ficheiro é fechado:
os dados pendentes são escritos no disco
os recursos associados ao ficheiro são libertados
o ponteiro para o ficheiro deixa de ser válido
int fclose(FILE *stream);
stream → ponteiro para o ficheiro aberto
Como é comportamento standard do C, esta função devolve 0 em caso de sucesso, e EOF em caso de erro.
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen("dados.txt", "r");
if (fp == NULL) {
printf("Erro ao abrir o ficheiro.\n");
return 1;
}
fclose(fp);
return 0;
}
Verificação de Erros
Existem duas funções importantes de verificação de erros: feof e ferror. São ambas funções da biblioteca padrão de C. As duas parecem iguais, mas verificam coisas diferentes. A feof indica se foi atingido o fim do ficheiro (EOF). A ferror verifica se ocorreu um erro no ficheiro.
int feof(FILE *fp);
diferente de 0-> chegou ao fim do ficheiro
0-> ainda não chegou ao fim
FILE *fp = fopen("dados.txt", "r");
char c;
while ((c = fgetc(fp)) != EOF) {
printf("%c", c);
}
if (feof(fp)) {
printf("Fim do ficheiro\n");
}
int ferror(FILE *fp);
diferente de 0-> houve erro
0-> sem erro
FILE *fp = fopen("dados.txt", "r");
if (fgetc(fp) == EOF) {
if (feof(fp))
printf("Fim do ficheiro\n");
if (ferror(fp))
printf("Erro de leitura\n");
}