Como fopen funciona em C: abrindo arquivos com modos de leitura, gravação e acréscimo

10

Você precisa de um identificador para tocar nos dados no disco. Em C, esse identificador é um ponteiro retornado por fopen. Você especifica um modo, recebe de volta um ponteiro e o usa para transmitir dados para dentro ou para fora. Os modos mais comuns são r para leitura, w para escrita e a para anexar. Se errar, você poderá perder dados ou travar seu programa.

Considere uma tarefa simples: escrever os números de 1 a 10 em um arquivo.

Este código abre um arquivo chamado out usando o modo w. Esta é uma escrita destrutiva. Se out não existir, o sistema o cria. Se existir, o conteúdo antigo será apagado e substituído. A variável f contém o ponteiro do arquivo. Você usa esse ponteiro para todas as operações subsequentes. Se o arquivo não puder ser aberto – problemas de permissão, disco cheio ou caminho inexistente – f se tornará NULL.

A função de saída aqui é fprintf. Funciona exatamente como printf, mas você passa o ponteiro do arquivo como primeiro argumento. Quando terminar, fclose libera o recurso.

Tratamento de erros de arquivo no main

Este trecho é o primeiro da série a retornar um código de erro de main. Quando fopen falha, f contém um valor nulo. Em C, zero é avaliado como falso. Todo o resto é verdade. O operador ! inverte essa lógica booleana.

if (!f) verifica se o ponteiro é nulo. É equivalente a if (f == 0), mas o primeiro é o idioma padrão. Se a condição for verdadeira, o programa retornará 1.

Em sistemas UNIX, é possível verificar esse status de saída diretamente na linha de comandos. Ele informa se o script ou programa foi executado com sucesso ou atingiu um obstáculo. Saber como detectar esses erros antecipadamente economiza horas de depuração posteriormente.

Por que nos preocupamos com códigos de retorno quando podemos travar? Porque a falha controlada é melhor do que o comportamento indefinido. Você pode registrar o erro, notificar o usuário ou tentar novamente. Deixar o programa morrer silenciosamente é uma engenharia preguiçosa.

A beleza desta abordagem reside na sua simplicidade. Você abre. Você verifica. Você escreve. Você fecha. Sem mágica. Nenhum estado oculto. Apenas um ponteiro e um arquivo.

Mas e se você precisar ler o que acabou de escrever? Ou anexar a um log existente sem destruir o histórico? A string de modo muda tudo. r deixa o arquivo sozinho. a adiciona ao final. w explode tudo. Escolha com cuidado.