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");
}