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

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Como utilizar fstream para archivos con rutas dinamicas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Como utilizar fstream para archivos con rutas dinamicas  (Leído 5,198 veces)
kerkox

Desconectado Desconectado

Mensajes: 15



Ver Perfil
Como utilizar fstream para archivos con rutas dinamicas
« en: 15 Abril 2014, 17:17 pm »

Hola a todos, tengo un problema con una funcion de fstream pues el problema es que para poder abrir un fichero debo de tener la ruta completa, pero yo quiero hacerla dinamica ya que se que se puede utilizar el %windir% para llegar a la letra del disco principal y la carpeta windows
Ejemplo.

Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <fstream>
  4.  
  5.  
  6. using namespace std;
  7.  
  8. bool file_exists(const char * f)
  9. {
  10.    ifstream file;
  11.    file.open(f);
  12.    if(file.fail())
  13.        return false;
  14.    file.close();
  15.    return true;
  16. }
  17.  
  18. int main()
  19. {
  20.  
  21. cout << "Vamos a ver si es fichero existe  " <<endl;
  22. cout << endl;
  23. cin.get();
  24.  
  25. //con esta no funciona
  26. bool j = file_exists("%windir%\system32\cmd.exe"); // se puede usar file.exe pues para verficar
  27. /*
  28. Peo con esta si funciona
  29. bool j = file_exists("c:\\windows\\system32\\cmd.exe");
  30. */
  31.  
  32.  
  33. if (j)
  34. {
  35.  
  36. cout << "si existe el archivo  "<< endl;
  37. cin.get();
  38.  
  39. }
  40. else
  41. {
  42.    cout << "No existe el archivo" << endl;
  43.    cin.get();
  44. }
  45.  
  46. return 0;
  47.  
  48.  
  49. }

Pues desearia conocer como hacer estas rutas dinamicas ya que las uso mucho para el sistema o si hay alguna otra forma de utlizar la libreria fstream
Cualquier ayuda es bienvenida o si pueden darme algun manual o recomendarme algo para poder descubrirlo por mi mismo.
 


En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Como utilizar fstream para archivos con rutas dinamicas
« Respuesta #1 en: 15 Abril 2014, 18:04 pm »

Simplemente obtener la ruta de la variable de entorno, podes usar GetEnvironmentVariable:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms683188(v=vs.85).aspx

GetEnvironmentVariable(%windir%) -> strcat + "\system32\cmd.exe" -> file_exists()



En línea

Stakewinner00


Desconectado Desconectado

Mensajes: 1.426



Ver Perfil WWW
Re: Como utilizar fstream para archivos con rutas dinamicas
« Respuesta #2 en: 15 Abril 2014, 18:08 pm »

Estuve haciendo unas pruebas y este código parece funcionar, el truco esta en la función getenv de la librería stdlib, el ejemplo esta en linux pero bueno.
Código
  1. #include <iostream>
  2. #include <stdlib.h>    
  3. int main ()
  4. {
  5. char* i;
  6. i=getenv("SHELL"); //quizás en tu caso sea "windir"
  7. std::cout << "Ruta relativa ";
  8. std::cout << i << std::endl;
  9. return 0;
  10. }
Espero que te sirva el ejemplo a parte de la info que paso el compañero.
« Última modificación: 15 Abril 2014, 18:10 pm por Stakewinner00 » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Como utilizar fstream para archivos con rutas dinamicas
« Respuesta #3 en: 15 Abril 2014, 18:24 pm »

Esta línea:
Código
  1. bool j = file_exists("%windir%\system32\cmd.exe"); // se puede usar file.exe pues para verficar

Se traduce como:
Código
  1. "%windir%system32cmd.exe"

Lo cual no es lo que quieres realmente.

Para comprobarlo este sencillo programa:
Código
  1. int main()
  2. {
  3.    char* a = "%windir%\system32\cmd.exe";
  4.    cout<<a<<endl;
  5.    return 0;
  6. }

La solución es ponerlo con doble \\:
Código
  1. bool j = file_exists("%windir%\\system32\\cmd.exe"); // se puede usar file.exe pues para verficar

Por cierto esta función:
Código
  1. bool file_exists(const char * f)
  2. {
  3.   ifstream file;
  4.   file.open(f);
  5.   if(file.fail())
  6.       return false;
  7.   file.close();
  8.   return true;
  9. }

Puede simplificarse:
Código
  1. bool file_exists(const char * f)
  2. {
  3.   ifstream file(f);
  4.   return file;
  5. }

Hace exactamente lo mismo. Aunque si te parece más clara puedes dejarla así:
Código
  1. bool file_exists(const char * f)
  2. {
  3.   ifstream file(f);
  4.   return file.good();
  5. }
« Última modificación: 15 Abril 2014, 18:27 pm por amchacon » En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Como utilizar fstream para archivos con rutas dinamicas
« Respuesta #4 en: 15 Abril 2014, 18:26 pm »

Notar que si es para Windows es mejor la Win32 y evitar usar ese tipo de librerias, olvide decirlo.
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Como utilizar fstream para archivos con rutas dinamicas
« Respuesta #5 en: 15 Abril 2014, 18:29 pm »

Notar que si es para Windows es mejor la Win32 y evitar usar ese tipo de librerias, olvide decirlo.
En potencia sí, pero en simpleza no me atrevería a decir eso (malditas Windows API ;D).

Si no necesita cosas de ficheros muy concretas, le basta y le sobra con la librería estándar.
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
Stakewinner00


Desconectado Desconectado

Mensajes: 1.426



Ver Perfil WWW
Re: Como utilizar fstream para archivos con rutas dinamicas
« Respuesta #6 en: 15 Abril 2014, 18:32 pm »

Ya que estoy añado que si uno quiere dedicarse a programar en windows si sería bueno practicar y usar la librería de windows pero si es solo para pruebas puntuales y luego tienes pensado programar más en linux por ejemplo entonces prefiero usar librerías estándares que librerías propias del SO.

Bueno, de momento creo que ya tienes 3 métodos distintos para hacer lo mismo...

Saludos
En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Como utilizar fstream para archivos con rutas dinamicas
« Respuesta #7 en: 15 Abril 2014, 18:40 pm »

En potencia sí, pero en simpleza no me atrevería a decir eso (malditas Windows API ;D).

Si no necesita cosas de ficheros muy concretas, le basta y le sobra con la librería estándar.
Bueno no se necesita tanta ciencia:

Código
  1. if(GetEnvironmentVariableW(TEXT("%windir%"),Buffer,sizeof(Buffer) / sizeof(Buffer[0])) > 0)
  2. {
  3.    wcscat(Buffer,TEXT("\\system32\\cmd.exe"));
  4.    file_exists(Buffer);
  5.    ...
  6. }
  7.  
pero bueno.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines