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.). .. code-block:: c 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 .. code-block:: c 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. .. code-block:: c #include 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. .. code-block:: c int feof(FILE *fp); - diferente de 0-> chegou ao fim do ficheiro - 0-> ainda não chegou ao fim .. code-block:: c FILE *fp = fopen("dados.txt", "r"); char c; while ((c = fgetc(fp)) != EOF) { printf("%c", c); } if (feof(fp)) { printf("Fim do ficheiro\n"); } .. code-block:: c int ferror(FILE *fp); - diferente de 0-> houve erro - 0-> sem erro .. code-block:: c 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"); }