Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Gestión de Archivos y Errores

Reglas de estilo para el manejo de archivos y diagnóstico de errores en C

Universidad Nacional de Río Negro

Gestión de Archivos y Errores (0x40XX)

Regla 0x4001h: Manejá correctamente la apertura y cierre de archivos

Siempre validá que el puntero devuelto por fopen no sea NULL antes de operar sobre él, y cerrá el recurso mediante fclose.

1
2
3
4
5
6
7
8
FILE *archivo = fopen("datos.txt", "r");
if (archivo == NULL)
{
    perror("Error al abrir archivo");
    return ERROR_ARCHIVO;
}
// ...
fclose(archivo);

Regla 0x4002h: Validá los retornos de las operaciones de lectura y escritura de archivos

Funciones como fread, fwrite, fgetc, fgets, fprintf y fscanf devuelven valores de control. Es obligatorio verificar dichos retornos para asegurar transferencias completas e identificar fallos o el fin de archivo (EOF).

Regla 0x4003h: Utilizá errno, perror y strerror para reportar fallos del sistema operativo de manera precisa

Cualquier fallo en llamadas de sistema de archivos (como fallos en fopen, fread o fwrite) establece un código de error global en la variable errno de <errno.h>. Debés usar perror o strerror de <string.h> para imprimir o formatear mensajes legibles de diagnóstico.

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <errno.h>
#include <string.h>

FILE *archivo = fopen("config.cfg", "r");
if (archivo == NULL)
{
    // perror imprime automáticamente el mensaje asociado al errno actual
    perror("Fallo al cargar config.cfg");
    
    // O podés usar strerror para obtener la cadena correspondiente
    fprintf(stderr, "Detalle técnico: %s (código %d)\n", strerror(errno), errno);
}

Regla 0x4004h: Asegurá la simetría de recursos al abrir y cerrar archivos en el mismo nivel de abstracción

La función que abre un archivo debe ser la misma responsable de cerrarlo, o bien se debe delegar formalmente su propiedad a una estructura/módulo administrador simétrico. Esto evita descriptores de archivo huérfanos que agoten el límite del sistema operativo.

Regla 0x4005h: Evitá el uso de offsets y posiciones fijas codificadas a mano en archivos binarios sin validar sus dimensiones

Cuando leés o escribís en una posición específica de un archivo binario mediante fseek, debés validar que la posición de destino sea válida y no exceda las dimensiones físicas del archivo. Calculá el tamaño del archivo usando fseek y ftell antes de realizar saltos aleatorios.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FILE *archivo = fopen("datos.bin", "rb");
if (archivo != NULL)
{
    // Obtener tamaño del archivo
    fseek(archivo, 0, SEEK_END);
    long tamano = ftell(archivo);
    rewind(archivo);

    long offset = 100 * sizeof(registro_t);
    if (offset < tamano)
    {
        fseek(archivo, offset, SEEK_SET);
        // Operación de lectura segura
    }
    fclose(archivo);
}