Ver Mensaje Individual
  #4  
Antiguo 10-01-2007
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Reputación: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Ahí va un ejemplo

¡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?
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine

Última edición por Ñuño Martínez fecha: 10-01-2007 a las 20:43:24. Razón: Asombro
Responder Con Cita