Ver Mensaje Individual
  #8 (permalink)  
Antiguo 23/08/2003, 11:13
leonardop
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 21 años, 8 meses
Puntos: 1
Hola,

Definitivamente percibo progresos considerables en tu código, te felicito. Se nota que tienes espíritu autodidacta y un entusiasmo notable para este oficio. Para mí es un placer y un honor ayudarte en lo que sea posible mientras aprendes este tipo de cosas básicas.

Bien, aquí te presento una modificación más del código de main(). En esta versión, se abre el archivo "contador.txt" en modo de lectura/escritura (r+), con el propósito de leer desde el archivo un valor entero, incrementarlo y finalmente volver a almacenarlo de vuelta. También hay algunos cambios de estilo mínimos, aunque eso ya es una nimiedad que puedes modificar a tu gusto... :)


Código:
int
main()
{
    FILE *da, *da2, *cant;

    char *cadena = NULL;
    char nombre[40];

    int contador = 0;
    int p = 0;


#define ARCHIVO_SALIDA   "inscriptos.xls"
#define ARCHIVO_SALIDA2  "inscrip_copia.xls"
#define ARCHIVO_CANT     "contador.txt"


    Recibe_parametros (&cadena);

    da   = fopen (ARCHIVO_SALIDA,  "a");
    da2  = fopen (ARCHIVO_SALIDA2, "a");


    if (! da || ! da2)
        exit (1);

    fprintf (da,  "\n");
    fprintf (da2, "\n");

    while (Identifica_variable (nombre, cadena, &p, 40)) {
        fprintf (da,  "%s\t", nombre);
        fprintf (da2, "%s\t", nombre);
    }

    fclose (da);
    fclose (da2);


    /* El archivo con el valor del contador se abre en modo de lectura
     * inicialmente */

    cant = fopen (ARCHIVO_CANT, "r+");

    if (! cant)
        exit (1);

    /* Vamos a asumir que el archivo solo contiene un numero entero,
     * el cual podemos leer de forma directa */

    fscanf (cant, "%d", &contador);

    contador++;

    fseek (cant, (long)0, SEEK_SET);  /* Ir al comienzo del archivo */

    fprintf (cant, "%d", contador);

    fclose(cant);


    /* Imprimir una cabecera HTTP requerida por la interfaz CGI y el
     * contenido de un documento HTML */

    printf (
"Content-Type: text/html\n\n"
"<html>\n"
"<head><title>GRACIAS POR ANOTARSE EN BARADERO 2003</title></head>\n"
"<body bgcolor=#000000 text=#FFFFFF><div align=center>\n"
"<p> </p>\n"
"<p><b><font face=Arial, Helvetica, sans-serif size=4>\n"
"<u>SU NUMERO DE INSCRIPCION ES:</u></font></b></p>\n"
"</div></body>\n"
"</html>\n");


    if (cadena)
        free(cadena); /* Libera la memoria de `cadena' */

    return 0;
}

Algunas anotaciones sobre esta versión:
  • Se requiere que el archivo "contador.txt" exista previamente a la ejecución del programa, de otro modo, lo más seguro es que la función fopen() sobre este archivo devuelva NULL.
  • En realidad, me hubiera gustado hacer uso de otras funciones que hubieran facilitado algunos detalles de implementación. Funciones como flock() para implementar un bloqueo de accesos a los archivos, o ftruncate() en medio de las manipulaciones sobre el archivo contador, o fstat() para efectos de mayor legibilidad del algoritmo, pero me he contenido por razones de compatibilidad y simplicidad. Básicamente, no conozco mucho del sistema operativo ni del compilador de C que has contado que usas.

    Eso sí, te animo a que consultes sobre la disponibilidad de funciones como las que he mencionado en tu compilador, de modo que puedas hacer más robusta y escalable tu aplicación.


Finalmente, sobre cómo probar que la aplicación funcione, lo ideal sería que contaras con un servidor web en tu máquina local con soporte para la interfaz CGI, y pudieras allí hacer tus pruebas. Aunque como verás, lo único que requiere esta aplicación para realizar su labor básica es que esté definida la variable de entorno CONTENT_LENGTH con algún valor numérico que indica cuántos bytes serán leídos desde `stdin'. No sé cómo se manejará el tema de variables de entorno en tu sistema, aunque por ejemplo en el mío ejecuto la aplicación de esta forma para realizar pruebas:


$ CONTENT_LENGTH=7 ./ejemplo.cgi
a=b&c=d


La primera línea corresponde a lo que escribo en la línea de comandos (ejemplo.cgi es el nombre del binario de la aplicación), y la segunda línea es el contenido de prueba que escribo por teclado para que esté disponible a la aplicación por medio de `stdin'.

La aplicación en este ejemplo responde con:


Content-Type: text/html

<html>
<head><title>GRACIAS POR ANOTARSE EN BARADERO 2003</title></head>
<body bgcolor=#000000 text=#FFFFFF><div align=center>
<p> </p>
<p><b><font face=Arial, Helvetica, sans-serif size=4>
<u>SU NUMERO DE INSCRIPCION ES:</u></font></b></p>
</div></body>
</html>


De modo que puedo ver que la aplicación parece ejecutarse correctamente. Por supuesto, lo mejor sería probarlo en el entorno real, una vez esté montado en el servidor final.

Por supuesto, creo que está de más decirte que te asegures de que el código fuente sea compilado sin mensajes de error ni advertencias, para restringir nuestro escenario de posibles errores a detalles en tiempo de ejecución. :)

Saludos