Ver Mensaje Individual
  #5 (permalink)  
Antiguo 11/07/2003, 16:56
leonardop
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 10 meses
Puntos: 1
Qué bonito que es ver personas con ese interés por la programación, y en especial cuando se interesan en C.

Bueno, creo que puedo ofrecerte algo de ayuda al menos en un nivel básico. Primero hablemos sobre la lectura de datos desde un archivo.

Hay básicamente dos formas de leer/escribir datos desde/en archivos. Puedes hacerlo mediante acceso aleatorio o acceso secuencial (esta terminología suena curiosa, ¿no?, cuando estudies teoría de programación puede que no lo entiendas todo a la primera, pero puedes impresionar a tus amigos con las palabras que aprendes :).

El acceso aleatorio quiere decir que puedes desplazarte a tu antojo en el interior de un archivo y leer o escribir información en cualquier lugar arbitrario. El acceso secuencial quiere decir que te desplazas ordenadamente deacuerdo a ciertos desplazamientos que por lo general se relacionan directamente con el tamaño de ciertas estructuras de datos en C.

Por la apariencia del ejemplo que has dado, tu caso tiene pinta de ser un caso más apropiado para la lectura aleatoria. Si usaras estructuras, como lo ha recomendado nuestro amigo, entonces harías uso del acceso secuencial.

En fin, como probablemente ya has aprendido, la forma más fácil de leer un archivo aleatoriamente en C es usando una función como fgets, o fscanf:

Código:
#include <stdio.h>
#include <stdlib.h>

/* Este programa lee un archivo e imprime su contenido linea por linea */

/* Limite fijo para el tamanyo del arreglo que sera usado para leer
 * cada linea del archivo. */
#define TAM_LINEA 1024

int
main (void)
{
    FILE *ap;  /* Apuntador al archivo */

    const char *archivo = "prueba.txt";  /* El nombre del archivo */
   
    char linea[TAM_LINEA];  /* Bufer para leer la informacion de cada
                             * linea del archivo */

    ap = fopen (archivo, "r");
    
    if (!ap) {
        printf ("No ha podido abrirse el archivo %s.\n", archivo);
        exit (1);
    }

    while (!feof (ap)) {
        fgets (linea, TAM_LINEA, ap);

        /* Solo se imprime la linea... No es muy interesante, pero que
         * bonito que se ve */
        printf ("%s", linea);
    }

    return 0;
}

Ahora, pasando al tema de cómo separar eso en trozos "comestibles"... Mmmm... usualmente no uso las librerias estándar de C ya que suelen tener sus limitaciones, pero en el espíritu de crear un ejemplo fiel, te hablaré de strtok(), una función que hace parte de la librería string.h y sirve para separar cadenas de acuerdo a ciertos delimitadores. Veamos un ejemplo:

Código:
#include <stdio.h>
#include <string.h>

/* Este programa separa una cadena por medio de un cierto delimitador */

int
main (void)
{
    /* Una cadena de prueba. Lastimosamente, debido al modo en que
     * opera strtok(), no puede ser constante. */
    char cadena[] = "Esta es una prueba. Que sabrosa es la vida.";

    char *trozo;  /* Apuntador a cada trozo */


    printf ("La frase \"%s\" puede separarse en:\n", cadena);

    /* Ahora, delimitaremos nuestra frasecilla */

    /* Primero, strtok recibe la cadena de origen y una cadena de
     * delimitacion */
    trozo = strtok (cadena, " ");

    while (trozo) {
        printf ("  %s\n", trozo);

        /* Despues de la primera llamada, strtok recibe NULL como
         * primer parametro */
        trozo = strtok (NULL, " ");
    }

    return 0;
}
Por supuesto, strtok() es una funcion con una cantidad de problemas, como que modifica la cadena fuente, y en general no se recomienda su uso (el manual de programación GNU dice explícitamente "no use esta función"...). Pero algo es algo.

¿En qué sistema operativo trabajas y qué compilador de C usas? Quizás pueda ayudarte con ejemplos de funciones de librerías no-estándar.

Finalmente otra pregunta, ¿tienes algún libro sobre C? Si no es así te recomiendo altamente que compres uno, uno de los clásicos es el libro de Kernighan y Ritchie "The C Programming Language", es muy bueno.