Cuando trabajamos con archivos en C, una de las primeras cosas que debemos entender es cómo se maneja el cursor dentro del archivo y cómo podemos leer su contenido de forma segura y controlada. Al abrir un archivo con fopen, el sistema coloca un cursor que indica la posición actual desde donde se leerá o escribirá. Este cursor funciona de manera similar a la línea que parpadea en un editor de texto, señalando el punto exacto en el archivo donde se realizará la próxima operación.
Si abrimos un archivo en modo lectura ("r"), el cursor se sitúa al principio del archivo, justo antes del primer carácter. Esto significa que la primera lectura comenzará desde el inicio. En cambio, si abrimos el archivo en modo escritura ("w"), el contenido previo se borra y el cursor también se coloca al principio, listo para escribir desde cero. Por otro lado, el modo append ("a") posiciona el cursor al final del archivo, permitiéndonos añadir contenido sin modificar lo que ya existe.
Para leer el contenido carácter a carácter, podemos usar la función fgetc. Esta función toma como argumento el descriptor del archivo y devuelve el siguiente carácter en la posición actual del cursor, desplazando el cursor una posición hacia adelante. Es importante destacar que, aunque fgetc lee un carácter, su valor de retorno es de tipo int. Esto se debe a que puede devolver un valor especial llamado EOF (End Of File), que indica que hemos llegado al final del archivo o que ha ocurrido un error en la lectura.
Veamos un ejemplo sencillo de cómo leer un archivo usando fgetc y detectar el final del archivo con EOF:
#include <stdio.h>
int main() {
FILE *archivo = fopen("temperatura.data", "r");
if (archivo == NULL) {
printf("No se pudo abrir el archivo.\n");
return 1;
}
int caracter_leido;
while ((caracter_leido = fgetc(archivo)) != EOF) {
putchar(caracter_leido);
}
fclose(archivo);
return 0;
}
En este código, abrimos el archivo temperatura.data en modo lectura. Luego, en un bucle while, llamamos a fgetc para obtener cada carácter. Mientras el valor leído no sea EOF, imprimimos el carácter. Cuando fgetc devuelve EOF, significa que hemos llegado al final del archivo y salimos del bucle.
Otra forma de controlar la lectura es usando la función feof, que recibe el descriptor del archivo y devuelve un valor distinto de cero cuando el cursor está al final del archivo. Esto nos permite construir bucles que se repitan hasta que se alcance el final, aunque es recomendable usar la comparación directa con EOF para evitar imprimir caracteres inválidos.
Un detalle importante es que, al leer con fgetc, el cursor se mueve automáticamente una posición hacia adelante después de cada lectura. Esto nos permite recorrer el archivo secuencialmente sin necesidad de manipular el cursor manualmente.
Para ilustrar cómo podemos usar feof junto con fgetc, podemos escribir un bucle do-while que lea y procese cada carácter, asegurándonos de no imprimir valores inválidos:
#include <stdio.h>
int main() {
FILE *archivo = fopen("temperatura.data", "r");
if (archivo == NULL) {
printf("No se pudo abrir el archivo.\n");
return 1;
}
int caracter_leido;
do {
caracter_leido = fgetc(archivo);
if (caracter_leido != EOF) {
putchar(caracter_leido);
}
} while (!feof(archivo));
printf("\nFin de archivo.\n");
fclose(archivo);
return 0;
}
Aquí, después de cada lectura, verificamos que el carácter no sea EOF antes de imprimirlo. Cuando feof indica que hemos llegado al final, salimos del bucle y mostramos un mensaje indicando que la lectura ha finalizado.
En resumen, al trabajar con archivos en C, entender el comportamiento del cursor y cómo usar funciones como fgetc, feof y la constante EOF es fundamental para leer datos de forma segura y eficiente. En capítulos posteriores, podemos profundizar en cómo manipular el cursor para posicionarnos en diferentes partes del archivo, lo que nos permitirá realizar operaciones más avanzadas como lecturas y escrituras aleatorias.