¡Qué demonios!
Código:
/* Cómo leer y buscar una palabra en un archivo. */
#include <malloc.h> /* Memoria dinámica. */
#include <stdlib.h>
#include <stdio.h> /* Para acceder a disco y escribir en pantalla. */
#include <string.h> /* Para manejar cadenas de caracteres. */
#define NOMBRE_ARCHIVO "archivo.txt"
#define PALABRA_A_BUSCAR "Yesica"
/* El programa empieza aquí. */
int main (void)
{
FILE *Archivo = NULL;
long TamannoArchivo = 0;
char *Datos = NULL, *Palabra = NULL;
long PosicionPalabra = 0;
/* Abrimos el archivo. */
Archivo = fopen (NOMBRE_ARCHIVO, "rb");
if (Archivo == NULL) {
/* Hubo un error. */
printf ("No pude abrir el archivo '%s'\n", NOMBRE_ARCHIVO);
return EXIT_FAILURE;
}
errno = 0; /* Ponemos el indicador de errores a "no hay error". */
/* Calcula el tamaño del archivo. */
fseek (Archivo, 0, SEEK_END); /* Vamos al final del archivo. */
TamannoArchivo = ftell (Archivo); /* Le preguntamos en qué octeto estamos. */
rewind (Archivo); /* Regresamos al principio del archivo. */
/* Comprobamos los errores. */
if (errno != 0) {
printf ("[%d] Error al analizar el archivo '%s'\n", errno, NOMBRE_ARCHIVO);
fclose (Archivo); /* No olvidar cerrarlo. */
return EXIT_FAILURE;
}
/* Reservamos espacio para almacenar los datos. */
Datos = (char*)malloc (TamannoArchivo, sizeof (char));
if (Datos = NULL) {
printf ("No pude reservar espacio para poder leer el archivo '%s'\n", NOMBRE_ARCHIVO);
fclose (Archivo); /* No olvidar cerrarlo. */
return EXIT_FAILURE;
}
/* Leemos el archivo. */
if (fread ((void*)Datos, sizeof (char), TamannoArchivo) != TamannoArchivo || errno != 0) {
printf ("[%d] Error al leer el archivo '%s'\n", errno, NOMBRE_ARCHIVO);
free (Datos); /* Liberar la memoria. */
fclose (Archivo); /* No olvidar cerrarlo. */
return EXIT_FAILURE;
}
/* Ahora ya podemos buscar la palabra. */
Palabra = strstr (Datos, PALABRA);
if (Palabra == NULL)
printf ("La palabra '%s' no se encuentra en el archivo '%s'\n", PALABRA, NOMBRE_ARCHIVO);
else {
/* Operación con punteros para saber dónde se encuentra la palabra. */
PosicionPalabra = (long)(Palabra - Datos);
printf ("La palabra '%s' se encuentra en el carácter número %ld del archivo %s\n", PALABRA, PosicionPalabra, NOMBRE_ARCHIVO);
}
/* Ahora, liberamos la memoria y cerramos el archivo. */
free (Datos);
fclose (Archivo);
/* Como no hubo errores, lo decimos. */
return EXIT_SUCCESS;
}
Dos detallitos:
- Es código C, no C++, pero debería funcionar en el compilador sin problemas. De todas formas, usando C++ no cambiaría mucho, salvo que te ahorras la gestión de memoria y todas las comprobaciones de error pueden resumirse en un único bloque try { ... } catch (...) { ... }
- Lo he hecho de memoria, así que no he comprobado si está perfecto. Eso deberás verlo tu.
[edit]Creo que esta vez gané a Seoane, ¿no?