Foros del Web » Programación para mayores de 30 ;) » Programación General »

Ayuda en C - Pregunta elemental

Estas en el tema de Ayuda en C - Pregunta elemental en el foro de Programación General en Foros del Web. Hace bastante que busco empezar con C pero me resulta extremadamente dificil ya que me faltan conocimientos sobre programacion en sí, metodologias y todo eso. ...
  #1 (permalink)  
Antiguo 11/07/2003, 03:03
 
Fecha de Ingreso: enero-2003
Mensajes: 120
Antigüedad: 21 años, 4 meses
Puntos: 0
Ayuda en C - Pregunta elemental

Hace bastante que busco empezar con C pero me resulta extremadamente dificil ya que me faltan conocimientos sobre programacion en sí, metodologias y todo eso.
El tema es que decidi ver si con algo de practica podia avanzar algo y afirmar estos conocimientos.
La primera aplicacion que intente hacer es algo asi como una agenda (se ejecuta desde consola) , por ahora lo mejor que pude hacer es guardar los datos en un archivo de texto con este formato:

contacto1 campo1 campo2 campo3
contacto2 campo1 campo2 campo3
etc...

el programa abre este archivo lee los datos y los despliega en pantalla y aca ya me encuentro con algo que escapa a mis conocimientos.
Como separo cada contacto y cada campo del mismo en variables independientes para poder tratarlas individualmente?
He hecho un par de cositas simples en php y para separar una cadena en trozos utilizaba la funcion explode()...en C esto se hace de la misma forma con alguna funcion predefinida?

Muchas gracias desde ya y espero que la pregunta no sea demasiado obvia
  #2 (permalink)  
Antiguo 11/07/2003, 08:15
 
Fecha de Ingreso: mayo-2002
Ubicación: Tijuana
Mensajes: 201
Antigüedad: 22 años
Puntos: 1
Bueno en tu caso lo que ocupas aqui a mi parecer son estructuras, eres nuevo como dices pero para hacer lo que deseas, es necesario que empaquetes tus campos o si lo prefieres que agreges un campo extra al final de cada linea, por ejemplo:

contacto1, campo1, campo2,campo3,bandera
contacto2, campo1, campo2,campo3,bandera

o con estructuras:

struct contacto:
tipo Numerodecontacto;
tipo campo1;
tipo campo2;
tipo campo3;

Ambas logicas pueden guardarse en archivos, pero la segunda se te hace el trabajo mas facil y limpio, solo una cosa usando el primer razonamiento vas a usar mas programacion para controlar tus campos y hacer lo que quieres hacer. Piensalo un poco y si tienes dudas como hacerlo por aqui andamos. Suerte y animo.
  #3 (permalink)  
Antiguo 11/07/2003, 09:18
 
Fecha de Ingreso: enero-2003
Mensajes: 120
Antigüedad: 21 años, 4 meses
Puntos: 0
Amigo Paisano:

Muchas gracias por tu ayuda, voy a ver si saco algo, con la 2da opcion que pusiste creo poder llegar a buen termino.
Ahora, me sigue quedando la duda sobre lo que te comentaba antes, como cortar una cadena en trozos para poder tratarlos por separado, si no es mucha molestia y me puedes dar una idea de esto seguramente me va a servir para un futuro cercano.
Gracias de nuevo
  #4 (permalink)  
Antiguo 11/07/2003, 15:05
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Hola...

Yo creo que para lo e las cadenas hay algo bueno en string.

Hay una para concatenar osea lo contrario pero debe haber una para hacer eso...

O si no con un bucle examinando carater a caracter la matriz de caracteres
Porque si va a depender de lo que quieras hacer..
  #5 (permalink)  
Antiguo 11/07/2003, 16:56
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 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.
  #6 (permalink)  
Antiguo 11/07/2003, 23:59
 
Fecha de Ingreso: enero-2003
Mensajes: 120
Antigüedad: 21 años, 4 meses
Puntos: 0
Muchas gracias a todos en verdad aprecio enormemente su ayuda
Actualmente estoy trabajndo con Windows XP, el compilador es Dev-C++, y lo unico que tengo son 2 tutoriales que encontre por ahi: uno es de mundoc.net y el otro de elrincondelc.com, este ultimo es el que estoy utilizando porque me resulta mas comprensible.
Leonardop: Voy a trabajar sobre lo que me has dejado a ver si puedo llegar a comprender mas o menos como funciona esto
Despues les comento los resultados.
Gracias !!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:50.