Fácil C
Verificando abertura de arquivo
Enunciado
Escreva um programa que tente abrir o arquivo dados.txt para leitura. Se a abertura falhar, use perror para mostrar o erro e retorne EXIT_FAILURE. Se abrir com sucesso, feche o arquivo e retorne EXIT_SUCCESS.
Requisitos
- Usar
fopencom modo"r". - Verificar se o retorno é
NULLe chamarperror. - Fechar o arquivo com
fcloseem caso de sucesso. - Retornar
EXIT_FAILUREouEXIT_SUCCESSconforme o caso.
Código inicial
#include <stdio.h>
#include <stdlib.h>
int main(void) {
// seu código aqui
return 0;
}
Saída esperada
Erro ao abrir arquivo: No such file or directory
Ver dica
Use perror("Erro ao abrir arquivo") para imprimir a mensagem do sistema.
Mostrar solução
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE *fp = fopen("dados.txt", "r"); // tenta abrir para leitura
if (fp == NULL) {
perror("Erro ao abrir arquivo"); // imprime mensagem do errno
return EXIT_FAILURE;
}
fclose(fp); // fecha se abriu
return EXIT_SUCCESS;
}
Passo a passo
fopen("dados.txt", "r")tenta abrir o arquivo em modo leitura. Se não existir, retornaNULL.- Comparamos
fp == NULLpara detectar a falha. Essa é a verificação obrigatória. perror("Erro ao abrir arquivo")imprime a mensagem passada seguida de:e a descrição do erro armazenado emerrno.- Retornamos
EXIT_FAILUREpara indicar ao sistema operacional que o programa terminou com erro. - Se
fpnão forNULL, fechamos o arquivo comfclosee retornamosEXIT_SUCCESS.
Por que funciona
fopen retorna NULL em caso de falha e define errno com o motivo (por exemplo, ENOENT). perror traduz esse código para uma mensagem legível. O retorno EXIT_FAILURE permite que scripts e o shell saibam que algo deu errado.
Erros comuns
- Esquecer de verificar
fp == NULLe usar o arquivo depois:fprintf(fp, ...)causa segmentation fault. - Usar
perrorsem queerrnoesteja definido: se você não chamou uma função que falhou, a mensagem pode ser enganosa. - Não fechar o arquivo: vazamento de descritor, embora o sistema feche ao encerrar.
Outra forma de resolver
Usar fprintf(stderr, "Erro: %s\n", strerror(errno)) em vez de perror. É preferível quando você quer formatar a mensagem de forma personalizada.
Saída esperada
Erro ao abrir arquivo: No such file or directory