Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Cómo Extraer Datos De Un *.txt

Iniciado por J_F_NASH, 08 de Julio de 2005, 02:31:19 PM

« anterior - próximo »

CoLSoN2

Cita de: "J_F_NASH"He estado probando lo de ifstream.
No se si me he explicado bien. Lo que quiero hacer es lo siguiente:

1) Tengo mi archivo archivo.cpp.
2) En el hago referencia a una constante (PEPE)
3) Que he metido en archivo.txt:
#define PEPE 5

Cuando compilo, evidentemente no encuentra PEPE.

No se, igual tendría que calentarme los cascos un poco mas con ifstream.
¿O hay otro camino mas simple aun?


S2
Definitivamente, te hacen falta unas buenas clases de C/C++.

Eso se soluciona con un #include.
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

J_F_NASH

 No, no quiero un include.
Veamos:
Cuando ya está compilado el proyecto obtengo un archivo ejecutable ¿no?.
Cuando lo ejecuto quiero que ENTONCES lea el archivo.txt que contiene la constante.

Si meto el include el archivo.txt quedará compilado en el ejecutable y al ejecutarlo nunca me pedirá el .txt (si este no estuviese en la carpeta)

Estoy con un buen libro, el "cómo programar C/C++ (H.M Deitel...). Pero si, la verdad es que me hacen falta unas buenas clases presenciales de C++. Ni idea de como conseguirlas.


S2.

CoLSoN2

 Si ya está compilado y necesitas usar una constante/define exterior, simplemente es imposible, porque no te compilaría en primer lugar si no encuentra esa constante. Ahora, sí lo que quieres es simplemente "cargar variables" o algo parecido, utiliza ficheros INI, XML, etc. y ya está.
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

J_F_NASH

 "Ahora, sí lo que quieres es simplemente "cargar variables" o algo parecido, utiliza ficheros INI, XML, etc. y ya está."
Eso es lo que quiero.
¿Cual es la manera de hacerlo?
Si es largo de explicar... algún sitio donde lo explique.


S2.

DraKKaR

 Mírate la MSDN en la pagina de microsoft sobre como cargar ficheros INI. Puedes empezar buscando la función GetPrivateProfileInt. O Mejor aún, croe recordar que algún forero habia implementado una clase de carga de ficheros INI. Podrías conseguirla para usarla o ver el código fuente.

J_F_NASH

Cita de: "AgeR"No te lo tomes a mal, pero viendo la mayoría de tus posts, me dá la impresión de que te falta una base solida.  ;)
Si, bueno, es que tengo a mi hermano (antiguo programador en AMSTRAD :) ) que pregunta cosas de ensamblador (del cual no tengo ni remota) y que de temas de windows y tarjetas andaba un tanto perdido.
Los dos preguntamos bajo el mismo nick ;)

El lenguaje que yo "controlo" (mas o menos) es Action Script 2.0 (Flash) que es muy similar al C++.
Ahora quiero pasar definitivamente a C++ junto con SDL pero me está costando porque desconozco la librería estandar de C.

Dicho esto acepto sugerencias.
Tengo un libro negro: "Como programar C/C++" de Deitel/Deitel que no está nada mal (eso si, un poco rollete en muchas ocasiones)
Si me recomiendas otro mas "volcado" en la creación de juegos sencillos en 2D mejor.


S2.  

Warchief

 Aquí está el inifile de Zaelsius:

http://www.stratos-ad.com/forums/index.php...=15&#entry53271


Un ejemplo de mi código en el que lo uso para leer la configuración de video:

bool GestorGrafico::init(IniFile & configFile)
{

// Título de ventana
SDL_WM_SetCaption(APP_NOMBRE,NULL);  
// Icono
// TODO: SDL_WM_SetIcon(IImage->Load(GFX_RESOURCE,"icono",&hIPF), NULL);


// Cargar modo de video
// Abrir fichero de configuración
if(!configFile.IsOpen()) {
 // Fallo
 ILogSystem.Msg(LOG_NORMAL,"%s El fichero de configuración debería estar abierto 's'\n",
     LOG_T_ERROR,INI_NOMBRE);
 return false;
}

// Cargar parámetros
if( !configFile.GetInt("video","ancho", a_ancho, 640) ||
 !configFile.GetInt("video","alto" , a_alto, 480) ||
 !configFile.GetInt("video","bpp", a_bpp, 32)) {
 // Por defecto
 ILogSystem.Msg(LOG_NORMAL,"%s Resolución no encontrada. Fijando por defecto.\n",LOG_T_ALERTA);

 if( !configFile.SetInt("video","ancho", a_ancho) ||
  !configFile.SetInt("video","alto" , a_alto) ||
  !configFile.SetInt("video","bpp", a_bpp)) {

  ILogSystem.Msg(LOG_NORMAL,"%s Falló la escritura de resolución a fichero de configuración '%s'\n",
   LOG_T_ERROR, INI_NOMBRE);
 }
}

// Crear pantalla con modo gráfico
screen = SDL_SetVideoMode(a_ancho,a_alto,a_bpp,SDL_SWSURFACE|SDL_DOUBLEBUF);    
if(screen==NULL)
{
 // Fallo
 ILogSystem.Msg(LOG_NORMAL,"%s Error en modo gráfico: %s (%dx%dx%d)\n",
     LOG_T_ERROR,SDL_GetError(),a_ancho,a_alto,a_bpp);
 return false;
}

// Cargar recursos
if(!cargarRecursosGUI()) {
 // Fallo
 ILogSystem.Msg(LOG_NORMAL,"%s Error en recursos GUI '%s'\n",
     LOG_T_ERROR,RECURSOS_GUI);
 return false;
}


return true;
}


Lo pongo entero porque está con SDL y a lo mejor te interesa.

Decir que la librería de TheAzazel (la CRM32Pro) me está simplificando las cosas muchísimo. Más con el editor de recursos y gui. Recomiendo eso en vez de tirar con SDL directamente. (www.megastormsystems.com)

Warchief

 Y añado.

Para tu ejemplo de PEPE bastaría un código como:


int valorPepe;

Inifile file;
file.Open("nombre.ini");
file.GetInt("NombreSeccion","PEPE", valorPepe);
file.Close();


Donde en el "nombre.ini" debería poner:

[NombreSeccion]
PEPE = 5


TheAzazel

 Jeje, muchas gracias Warchief ;)

ya hablare con Zaelsius a no mucho tardar para incorporar su clase de control de INI a CRM32Pro :)

poz naaa

happy coding!

DraKKaR

Cita de: "Warchief"Y añado.

Para tu ejemplo de PEPE bastaría un código como:


int valorPepe;

Inifile file;
file.Open("nombre.ini");
file.GetInt("NombreSeccion","PEPE", valorPepe);
file.Close();


Donde en el "nombre.ini" debería poner:

[NombreSeccion]
PEPE = 5
supongo ke esta línea

file.GetInt("NombreSeccion","PEPE", valorPepe);

debería ser así:

file.GetInt("NombreSeccion","PEPE", [B]&[/B]valorPepe);


Warchief

 
Cita de: "DraKKaR"supongo ke esta línea

file.GetInt("NombreSeccion","PEPE", valorPepe);

debería ser así:

file.GetInt("NombreSeccion","PEPE", [B]&[/B]valorPepe);
Uhm. No.


bool  GetInt( const char* section, const char* key, int& value, int defaultValue = 0 );


Yo también pensaba que sería un puntero, pero esa es la API del IniFile.


Como puse en mi código:

// Cargar parámetros
if( !configFile.GetInt("video","ancho", a_ancho, 640) ||
!configFile.GetInt("video","alto" , a_alto, 480) ||
!configFile.GetInt("video","bpp", a_bpp, 32)) {
// Por defecto
ILogSystem.Msg(LOG_NORMAL,"%s Resolución no encontrada. Fijando por defecto.\n",LOG_T_ALERTA);

if( !configFile.SetInt("video","ancho", a_ancho) ||
 !configFile.SetInt("video","alto" , a_alto) ||
 !configFile.SetInt("video","bpp", a_bpp)) {

 ILogSystem.Msg(LOG_NORMAL,"%s Falló la escritura de resolución a fichero de configuración '%s'\n",
  LOG_T_ERROR, INI_NOMBRE);
}
}


Aunque ese código tiene un bug (por el cortocircuito de los | en el primer if), que hará que si falta el ancho, el alto y el bpp tengan valor por defecto (no leído, ni por defecto de lectura), que en mi constructor es -1.

Creo que el código correcto sería:

bool cargaP = configFile.GetInt("video","ancho", a_ancho, 640);
cargaP = configFile.GetInt("video","alto" , a_alto, 480) && cargaP;
cargaP = !configFile.GetInt("video","bpp", a_bpp, 32) && cargaP;
if(!cargaP) {
 // Por defecto
 ILogSystem.Msg(LOG_NORMAL,"%s Resolución no encontrada. Fijando por defecto.\n",LOG_T_ALERTA);

 if( !configFile.SetInt("video","ancho", a_ancho) ||
  !configFile.SetInt("video","alto" , a_alto) ||
  !configFile.SetInt("video","bpp", a_bpp)) {

  ILogSystem.Msg(LOG_NORMAL,"%s Falló la escritura de resolución a fichero de configuración '%s'\n",
   LOG_T_ERROR, INI_NOMBRE);
 }
}

Pogacha

 En realidad la idea seria que te leas un libro de C o C++, ambos tratan inevitablemente el uso de archivos.
en C con fscanf(f,"%d", &Pepe); y en C++ con Pepe <<  f;
Vas a volar muy poco si no lo haces ... pues es como pegarte las alas con cera!
Saludos.

Warchief

 En el código que puse dos mensajes más arriba hay una errata:

Citar
bool cargaP = configFile.GetInt("video","ancho", a_ancho, 640);
cargaP = configFile.GetInt("video","alto" , a_alto, 480) && cargaP;
cargaP = !configFile.GetInt("video","bpp", a_bpp, 32) && cargaP;
if(!cargaP) {
// Por defecto
ILogSystem.Msg(LOG_NORMAL,"%s Resolución no encontrada. Fijando por defecto.\n",LOG_T_ALERTA);

if( !configFile.SetInt("video","ancho", a_ancho) ||
  !configFile.SetInt("video","alto" , a_alto) ||
  !configFile.SetInt("video","bpp", a_bpp)) {

  ILogSystem.Msg(LOG_NORMAL,"%s Falló la escritura de resolución a fichero de configuración '%s'\n",
   LOG_T_ERROR, INI_NOMBRE);
}
}

El signo de exclamación no debería estar.

Douch

 Pasate por aquí C con Clase, tiene un curso de C++ bastánte majo.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.