elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  problema con sprintf
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: problema con sprintf  (Leído 1,999 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
problema con sprintf
« en: 9 Febrero 2014, 19:46 pm »

Saludos, tengo el siguiente código que me tiene que abrir un archivo que se llama P1ASM.txt, pero el programa me tiene que preguntar el nombre del archivo para ver si se encuentra, pero me imprime No se pudo abrir el archivo y no entiendo por que si el archivo se encuentra en la misma carpeta donde tengo el codigo no deberia de haber errores

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAX 40
  5.  
  6. int main()
  7. {
  8.   FILE *fd;
  9.    char nombre[MAX],archivo[MAX];
  10.    printf("Que archivo quieres abrir: ");
  11.    fgets(nombre,MAX,stdin);
  12.    sprintf(archivo,"%s.txt",nombre);
  13.    if((fd = fopen(archivo,"r"))!= NULL)
  14.       printf("Si se encontro");
  15.    else
  16.       printf("No se pudo abrir el archivo");
  17.   return 0;
  18. }
  19.  

gracias


En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: problema con sprintf
« Respuesta #1 en: 9 Febrero 2014, 19:58 pm »


El problema lo provoca el caracter \n que introduce fgets en la cadena.

Si pruebas con gets o scanf no tendrás ese problema.

¡¡¡¡ Saluditos! ..... !!!!





En línea

m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: problema con sprintf
« Respuesta #2 en: 9 Febrero 2014, 20:21 pm »

muchas gracias leosansan por tu respuesta, en vez de usar el gets le puse una funcion para quitarle el salto de linea '\n' y ya con esto ya lo hace correctamente. Una ultima duda, si yo quisiera que al escribirse el nombre del archivo a abrir, no necesariamente tenga que ser identicamente a como se encuentra el original y que pudiera hacerse indistintamente con combinaciones de mayúsculas y minúsculas, ¿cómo lo podría hacer? alguna idea??
En línea

Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: problema con sprintf
« Respuesta #3 en: 11 Febrero 2014, 03:01 am »

Una observación, la función fgets() es más segura por cuánto permite limitar la longitud de la cadena recibida (el argumento MAX que le pasas), y así prevenir un desbordamiento del búfer. Una verificación que no hacen ni gets() ni scanf(). De hecho, algunos compiladores advierten sobre el uso riesgoso de gets() , desaconsejando su uso.

Yo en su lugar seguiría usando fgets() pero "recortaría" la cadena:

Código
  1. if ( ( len = strlen( nombre ) ) > 0 && nombre[len - 1] = '\n') nombre[len - 1] = '\0';

Ahora, respecto a que quieres pasar el nombre del archivo sin distinguir mayúsculas y minúsculas lo veo un poco más difícil. Obviamente, no te vas a poner a probar todas las combinaciones de minúsculas y mayúsculas, a ver si alguna abre el archivo (jeje)

A mi se me ocurre listar el contenido del directorio, y probar nombre por nombre contra el nombre dado por el usuario. Si alguno coincide (despreciando mayúsculas y minúsculas), abrir el fichero. Para eso, se requiere un compilador que implemente la biblioteca <unistd.h> la cual obedece un estándar llamado POSIX. Es hecho que sea estándar significa que con seguridad la tienes en una implementación de C para Linux, pero no necesariamente en Windows  :silbar: (ya saben como es Microsoft, rompe-estándares).  

¿Usas Windows verdad? En ese caso, compila con IDE libre para Windows como Dev-Cpp, o MinGW con gcc/g++. No estoy seguro que Borland C lo soporte (la verdad no tengo idea, pues no uso ni Windows ni Borland, jeje).

Bueno, a lo nuestro.
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <dirent.h>
  5. #include <ctype.h>
  6.  
  7. #define MAX 40
  8.  
  9. char * str_to_lower( char *);
  10.  
  11. int main()
  12. {
  13. FILE *fd = NULL;
  14. char name[MAX];
  15. unsigned long len;
  16. char ready;
  17.  
  18. char dir_name[100]; /* nombre de directorio */
  19. DIR * dir_ptr = NULL; /* apuntador a directorio */
  20. struct dirent * dirent_ptr; /* estructura 'directory-entry' */
  21. char * f_name; /* name de cada fichero leído en el directorio */
  22.  
  23. printf("Que archivo quieres abrir: ");
  24.  
  25. fgets( name, MAX, stdin );
  26. /* quitamos el '\n' al final de la cadena */
  27. if ( ( len = strlen( name ) ) > 0 && name[len - 1] == '\n' )
  28. name[len - 1] = '\0';
  29. strcat( name, ".txt" ); /* añadimos '.txt' al final */
  30.  
  31. /* pongamos el directorio como el actual, puedes cambiarlo xD */
  32. strcpy( dir_name, ".");
  33.  
  34. /* 'abrimos' el directorio para leer su contenido */
  35. if ( ( dir_ptr = opendir( dir_name ) ) == NULL ) {
  36. printf( "No existe o no se pudo abrir el directorio '%s'\n", dir_name );
  37. return -1;
  38. }
  39.  
  40. /* ahora recorremos todo el directorio, buscando
  41. * names de fichero que coincidan */
  42. ready = 0;
  43. while ( ( dirent_ptr = readdir( dir_ptr ) ) != NULL ) {
  44. f_name = dirent_ptr -> d_name;
  45.  
  46. /* verificamos omitiendo mayúsculas y minúsculas */
  47. if ( ! strcmp( str_to_lower(name), str_to_lower(f_name) ) )
  48. if((fd = fopen(f_name, "r")) != NULL) {
  49. printf("Se abrio '%s'\n", f_name);
  50. ready = 1;
  51. }
  52. }
  53.  
  54. /* y si al finalizar el ciclo no encontro, emitir error */
  55. if ( !ready )
  56. printf("No se pudo abrir el archivo\n");
  57.  
  58. /* cerramos el directorio, y el fichero */
  59. if ( dir_ptr != NULL ) closedir( dir_ptr );
  60. if ( fd != NULL ) fclose( fd );
  61.  
  62. return 0;
  63. }
  64.  
  65. /* Pasa todos los caracteres de la cadena a minúsculas */
  66. char * str_to_lower( char * s ) {
  67.  
  68. size_t k = 0;
  69.  
  70. while ( s[k] != '\0' ) {
  71. if ( isalpha( s[k] ) ) s[k] = tolower( s[k] );
  72. k++;
  73. }
  74.  
  75. return s;
  76. }

Este programa es funcional, sólo necesita ser compilado y probado. Por ejemplo, yo tengo el mi directorio un file1.txt, y al pasarle el nombre 'FiLe1' me dice que lo abrió. Al pasarle 'FilE2' no lo abre, porque no tengo 'file2.txt'.

Como ves, recorremos todo el directorio y convertimos sus nombres a minúsculas usando las funciones de biblioteca isaplha() (prueba si es una letra), y tolower() (pasa una letra a minúscula).

Lo de recorrer directorio requiere conocer acerca de la estructura dirent y la función readdir. Yo escribí un post al respecto el otro foro, te invito a leerlo para comprender esto mejor: http://foro.chuidiang.com/ccplusplus-linux/listar-contenido-de-un-directorio-usando-funciones-posix-de-c/

Se esperan comentarios, opiniones, etc .....  :)
« Última modificación: 11 Febrero 2014, 03:44 am por yoel_alejandro » En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[AYUDA] Warning: sprintf() [function.sprintf]: Too few arguments
PHP
Rudy21 3 5,468 Último mensaje 30 Julio 2008, 15:51 pm
por Ertai
Problema con sprintf()
Programación C/C++
soyloqbuskas 2 2,079 Último mensaje 12 Octubre 2012, 02:47 am
por soyloqbuskas
problema con sprintf()
Programación C/C++
m@o_614 1 1,563 Último mensaje 25 Septiembre 2013, 19:30 pm
por rir3760
Acceder de forma individual a cada digito de un número entero(sin sprintf)
Programación C/C++
DanielPy 4 2,665 Último mensaje 16 Noviembre 2013, 02:36 am
por DanielPy
Arreglos,punteros y sprintf.-
Programación C/C++
DanielPy 4 2,614 Último mensaje 13 Diciembre 2013, 17:50 pm
por DanielPy
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines