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!
- Inicie sesión o regístrese para enviar comentarios
- 903 lecturas


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 = optargestabas 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.txtMuestra algo como:
Estoes
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.txtNo 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 fopenman 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!
Maxmalkav, a pesar de esa modificación, con las llamadas que cita en sus mensajes, seguirá sin funcionar.
Ok, ya vi el "printf".