C problemas al leer archivo al usar getopt [Solucionado]

Hola a todos!

Antes de nada gracias por colaborar y ayudarme con mi problema. Soy bastante nuevo en C y estoy teniendo un problemilla al reconocer los argumentos de un programa en C y usarlos para abrir un archivo de texto. Aqui les dejo el fragmento de codigo que me esta dando problemas, a ver si ustedes ven el error!

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

/* [...] Aqui hay algunas funciones como son usage() o printTime() etc...*/

main(int argc, char **argv)
{
    printf("Starting...\n");

    bool wordListDefined = false;
    char * wordList;

    if(argc > 1)
    {
        int a;
        while ((a = getopt (argc, argv, "hv:w:")) != -1) switch (a)
        {

            /* [...] Aqui se procesan algunos argumentos mas... */

           case 'w':
             //wordList = optarg;
             strcpy(wordList, optarg);
             wordListDefined = true;
             break;

            /* [...] Mas argumentos... */
        }

        for (a = optind; a < argc; a++)
        {
           /* [...] aqui los argumentos no reconocidos... */
        }
    }
    else usage();

    if(!wordListDefined)
    {
        /* [...] Se hacen varias cosillas y se sale del programa... */
    }

    printf("Using the wordlist: %s\n", wordList);

    char * line;
    FILE *inFile = fopen(wordList, "r+");
    while (!feof(inFile))
    {
        fscanf(inFile, "%s", line); // No se si el pointer aqui esta bien... Creo que si no?
        printf("%s", line);
    }
    fclose(inFile);

   
    printf("Done!\n");
}

Anteriormente este programa abria un archivo el cual se especificaba mediante argv[3], pero si uso getopt no logro abrirlo. Otra cosa que modifique con respecto al anterior que si funcionaba es la variable "char * line", que antes era "char line[20]" y no estoy muy seguro de si eso puede resultar en error...

Gracias por vuestra ayuda!

firebird_ysc escribió:

Hola a todos!

Antes de nada gracias por colaborar y ayudarme con mi problema. Soy bastante nuevo en C y estoy teniendo un problemilla al reconocer los argumentos de un programa en C y usarlos para abrir un archivo de texto. Aqui les dejo el fragmento de codigo que me esta dando problemas, a ver si ustedes ven el error!

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

/* [...] Aqui hay algunas funciones como son usage() o printTime() etc...*/

main(int argc, char **argv)
{
    printf("Starting...\n");

    bool wordListDefined = false;
    char * wordList;

    if(argc > 1)
    {
        int a;
        while ((a = getopt (argc, argv, "hv:w:")) != -1) switch (a)
        {

            /* [...] Aqui se procesan algunos argumentos mas... */

           case 'w':
             //wordList = optarg;
             strcpy(wordList, optarg);
             wordListDefined = true;
             break;

            /* [...] Mas argumentos... */
        }

        for (a = optind; a < argc; a++)
        {
           /* [...] aqui los argumentos no reconocidos... */
        }
    }
    else usage();

    if(!wordListDefined)
    {
        /* [...] Se hacen varias cosillas y se sale del programa... */
    }

    printf("Using the wordlist: %s\n", wordList);

    char * line;
    FILE *inFile = fopen(wordList, "r+");
    while (!feof(inFile))
    {
        fscanf(inFile, "%s", line); // No se si el pointer aqui esta bien... Creo que si no?
        printf("%s", line);
    }
    fclose(inFile);

   
    printf("Done!\n");
}

Anteriormente este programa abria un archivo el cual se especificaba mediante argv[3], pero si uso getopt no logro abrirlo. Otra cosa que modifique con respecto al anterior que si funcionaba es la variable "char * line", que antes era "char line[20]" y no estoy muy seguro de si eso puede resultar en error...

Gracias por vuestra ayuda!

¿Te funciona si le pasas a getopt la cadena "vw:" en lugar de "hv:w:"? ¿Cuál es el motivo exacto de usar "hv:w:"? No se interpretar el significado de la "h".

Por otro lado, char *line te está haciendo petar el programa sí o sí. Si declaras sólo un puntero, tienes una variable que almacena una dirección a una zona de memoria ... que no ha sido reservada, sobre la que no tienes permiso de acceso y que provocará una excepción de las épicas cuando intentes usarla.

Además, sin reservar memoria, el puntero contendrá una dirección aleatoria (el típico contenido "basurilla") o directamente apuntará a la dirección 0 (dependerá de como inicias el puntero).

O bien usas char linea[20] (declara un puntero y le asocia un área de memoria que puede contener 20 caracteres) o bien declaras un char *linea y luego comienzas una andadura infernal con malloc().

Saludos

Hola maxmalkav!

En cuanto a lo de las opciones de getopt:
h -> para mostrar la ayuda
v: -> es para coger otra opcion
w: -> la que nos interesa... es la direccion del archivo de texto...
lo que queria decir es que cuando usaba "FILE *inFile = fopen(argv[3], "r+");" funcionaba bien, era capaz de leer el archivo, sin embargo ahora usando "FILE *inFile = fopen(wordList, "r+");" no soy capaz de leerlo... Que es lo que esta mal?

En cuanto a "char * line":
Ok lo corregire! Ya se que tengo que darles un repaso a los punteros ;) me resultan un poco dificiles pero es cuestion de ponerse... jaja

Muchas gracias!

Con

strcpy(wordLine, optarg);

estamos con las mismas que el caso del otro puntero.

Cuando hacías

wordLine = optarg

estabas anotando en wordLine la misma dirección de memoria reservada a la que apuntaba optarg (dos referencias a una misma zona de memoria.

Con strcpy estás intentando copiar el contenido del área de memoria apuntada por optarg a la dirección de memoria apuntada por ... ¡un momento!¡wordLine no está apuntando a ningún sitio!, no al menos un área de memoria "válida". Si reservas espacio para wordLine al declararlo, creo que avanzarás un poco hacia la solución.

Ummm a ver comencemos desde el principio...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

main(int argc, char **argv)
{
    FILE *inFile = fopen(argv[1],"r+");
    while (!feof(inFile))
    {
        printf("%s", inFile);
    }
    fclose(inFile);        
}

Este programa ejecutado asi:

programa.exe test.txt

Muestra algo como:

Esto
es
un
test

Ahora con getopt:

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

main(int argc, char **argv){

    char wordList[100];
    int a;
    while ((a = getopt (argc, argv, "w:")) != -1) switch (a)
    {
        case 'w':
            strcpy(wordList, optarg);
            break;
    }
    FILE *inFile = fopen(wordList,"r+");
    while (!feof(inFile))
    {
        printf("%s", inFile);
    }
    fclose(inFile);
}

Este programa ejecutado asi:

programa.exe test.txt

No muestra nada y se congela sin llegar a mostrar error....

Que es lo que esta mal?

Tienes errores gruesos de concepto en tu programa. Mi consejo es que aprendas a usar un depurador de código como gdb y descubras por ti mismo los errores. Después de estos vendrán otros y es mejor para ti que seas autónomo.

También te puede ser útil instalar las páginas de manual de las funciones de C que estás usando. El paquete es manpages-es y seguro que te sirve leer las páginas de manual:

man fopen
man feof

Por cierto, ¿por qué añades al ejecutable la extensión .exe? No es habitual en GNU/Linux.

Ummm jaja vale tendre que revisarlo un poco... jaja ya he dicho que soy nuevo en C xDD haré una revisión general de todo lo dado... jaja En cuanto a la extensión fue que en ese instante estaba en windows (jugando...) y se me coló aunque habitualmente use Debian... En cuanto al depurador tienes mucha razón... no me habia parado a utilizar ninguno!

Gracias!

Ya te lo he dicho, strcpy te la está liando parda. Estás intentando copiar sin tener una ubicación válida de destino.

Cambia strcpy por la asignación wordList = optarg, y prueba de nuevo.

Maxmalkav, a pesar de esa modificación, con las llamadas que cita en sus mensajes, seguirá sin funcionar.

Ese es el problema... no funciona de ninguna de las 2 formas... Hoy empecé el libro "C/C++ Curso de Programación" de Fco. Javier Ceballos para que mis conocimientos pasen a ser algo más "oficiales" que el de los tutos que hay por ahi por internet y el copy/paste de trozos de código... Llevo un par de capítulos solamente y me estoy dando cuenta de que cometía montones de errores a pesar del muy poco código que escribo... de hecho solo dos microprogramas llevo... Lo que si me gustaría es saber como usar getopt y abrir el dichoso archivo... Gracias!

sansatan escribió:

Maxmalkav, a pesar de esa modificación, con las llamadas que cita en sus mensajes, seguirá sin funcionar.

Ok, ya vi el "printf".