Busqueda desde txt en C++

Iniciado por cassiel83, 3 Abril 2012, 17:10 PM

0 Miembros y 1 Visitante están viendo este tema.

cassiel83

Buenas tardes a todos tengo un problema con un programa que lee desde un listado txt los nombres de unos archivos, luego llama a una funcion que intenta abrirlos uno a uno para considerar si existen o no.
El problema es que si escribo directamente el nombre del archivo en el programa lo encuentra, pero si lo lee desde el listado, lo mete en un string y se lo pasa a la función no lo hace. Alguna idea de donde puede estar el fallo?.

Gracias de antemano

El listado tiene esta forma:
arc_2012041
arc_2012042
arc_2012043
arc_2012044


y el programa es este:
#include <stdio.h>

//funcion de existencia
void existe(char archivo[60]);

//programa principal
int main ()
{
char archivo1[30];
char ruta[60];

FILE *listado;

listado = fopen("lista.txt", "r");
if (listado==NULL)
{
printf("No se encuentra el listado\n");
return 1;
}

while (fgets(archivo1, 30, listado)!=NULL)
{
sprintf(ruta,"D:\\carpeta\\%s",archivo1);
existe(ruta);
}

fclose(listado);
return 0;
}

//funcion de existencia
void existe(char archivo[60])
{
FILE *faux;

faux = fopen(archivo, "r");
if (faux==NULL)
printf("archivo no encontrado\n");
else
{
printf("archivo encontrado\n");
fclose(faux);
}
}


satu

Hola

Ahora estoy en clase y no puedo ver bien el código (en estas pantallas se ve fatal y no puedo probarlo), pero no veo nada raro, lo único que se me ocurre es que escribas las extensiones de los archivos en el listado. Si sigues con problemas intentaré verlo luego en casa o que alguien más entre y lo vea.

Saludos
Breakbeat como forma de vida

cassiel83

Hola, gracias. En mi listado completo si que aparecen las extensiones de los archivos, y aun asi falla

durasno

Hola! si tu listado tiene esta forma:
arc_2012041
arc_2012042
arc_2012043
arc_2012044
lo mas probable que el error sea al usar fgets(archivo1, 30, listado). fgets lee hasta encontrar el ENTER el cual tambien es almacenado en el arreglo archivo1
No es lo mismo abrir una cadena como "arc_2012041" que "arc_2012041\n".. Con fgets el salto de linea tambien pertenec al string

Te combiene usar fscanf o generar un ciclo con fgetc

Saludos
Ahorrate una pregunta, lee el man

cassiel83

#4
Tenias razon habia que usar fscanf. Al final lo he puesto asi:

while (fscanf(listado,"%s", archivo1)!=EOF)
{
sprintf(ruta,"D:\\carpeta\\%s",archivo1);
existe(ruta);
}


Muchas gracias ;-)

cassiel83

Otra vez me he atascado  :huh:, ahora el problema es que tengo el listado:

arc_201201.txt;10;20;30
arc_201202.txt;11;22;33
arc_201203.txt;12;23;34
arc_201204.txt;13;25;36


y no encuentro la manera de pasar los campos separados por el ";" a una variable para luego pasarla a la función.
he intentado hacerlo con un bucle con fgetc para que lea hasta encontrar el separador o el salto de linea pero esta funcion devuelve solo un caracter a la vez.
alguna idea de como podría hacerlo. Gracias y saludos.



durasno

Hola! ahi ya se complica un poco mas. Lo que se me ocurre en este momento es que usas la funcion strtok. Te dejo un link para q veas el uso de strtok
http://c.conclase.net/librerias/index.php?ansifun=strtok#inicio

Cualquier cosa segui preguntando, saludos
Ahorrate una pregunta, lee el man

cassiel83

Hola, ya lo he resuelto gracias a tu ayuda, funciona lo mas importante, ahora solo falta pulirlo, es cuestión de modificar un poco el bucle.

muchas gracias  ;D

me quedó así:

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

int main()
{
char var1[20];

char linea[50];
char token[5] = ";";

char *ptr;

FILE *listado;
listado = fopen("lista.txt", "r");


while (fscanf(listado,"%s", linea)!=EOF)
{
printf( "linea=%s\n", linea );

ptr = strtok( linea, token );
sprintf(var1,"%s",ptr);

printf("en variable %s\n", var1);

while( (ptr = strtok( NULL, token )) != NULL )
{
sprintf(var1,"%s",ptr);
printf("en variable %s\n", var1);
}
}

   return 0;
}

durasno

Perfecto!! solo basta adaptarlo a tu necesidad y listo :)

Saludos
Ahorrate una pregunta, lee el man