Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: J_F_NASH en 08 de Julio de 2005, 02:31:19 PM

Título: Cómo Extraer Datos De Un *.txt
Publicado por: J_F_NASH en 08 de Julio de 2005, 02:31:19 PM
 Estoy con C++
Trato de leer los datos de un archivo txt.
Este contiene:
#define VARIABLE_A 50
#define VARIABLE_B 30

Estoy probando con:
_open("fichero", flag);

Pero no hay manera. Simplemente encuentra el fichero pero es como si no leyese lo que hay dentro.



S2.
Título: Cómo Extraer Datos De Un *.txt
Publicado por: CoLSoN2 en 08 de Julio de 2005, 02:48:02 PM
 Utiliza la clase ifstream de la librería estándar.

Ejemplo:

// reading a text file
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>

int main () {
 char buffer[256];
 ifstream examplefile ("example.txt");
 if (! examplefile.is_open())
 { cout << "Error opening file"; exit (1); }

 while (! examplefile.eof() )
 {
   examplefile.getline (buffer,100);
   cout << buffer << endl;
 }
 return 0;
}
 
Título: Cómo Extraer Datos De Un *.txt
Publicado por: sés en 08 de Julio de 2005, 03:50:46 PM
 fopen() ^_^
Título: Cómo Extraer Datos De Un *.txt
Publicado por: CoLSoN2 en 08 de Julio de 2005, 04:36:45 PM
 Que estamos en el siglo XXI, por el amor de un dios..

Además, a todos los anticuados de por aquí os digo, que en el VS2005 todas estas mariconadas de manejo de ficheros de stdio.h (como fopen) y de cadenas de string.h (como strcpy) están marcadas como deprecated (soltando un bonito warning 4101).
Título: Cómo Extraer Datos De Un *.txt
Publicado por: senior wapo en 08 de Julio de 2005, 04:49:50 PM
 Unas narices!  antes me caso que dejar el fopen XDD


PD: realmente me da igual, es solo costumbre. Por cierto, ¿ no era mas lento iostream que fopen&cia ? habia unos benchmarks creo...
Título: Cómo Extraer Datos De Un *.txt
Publicado por: CoLSoN2 en 08 de Julio de 2005, 04:51:07 PM
 Pues ve pidiendo hora que con tanta cola de gays dentro de poco casarse va a ser casi imposible.
Título: Cómo Extraer Datos De Un *.txt
Publicado por: _Grey en 08 de Julio de 2005, 05:00:26 PM
 A mi tambien me cuesta dejar el fopen() y toda la parafernaria de C, printf() y demas...

Pero si empieza a darle a esto mejor que le coja el tranqui a la libreria estandar de C++, aunque sea solo para que coja costumbre, que despues no hay quien lo deje.

Saludos.
Título: Cómo Extraer Datos De Un *.txt
Publicado por: sés en 08 de Julio de 2005, 05:24:43 PM
Cita de: "CoLSoN2"Además, a todos los anticuados de por aquí os digo, que en el VS2005 todas estas mariconadas de manejo de ficheros de stdio.h (como fopen) y de cadenas de string.h (como strcpy) están marcadas como deprecated (soltando un bonito warning 4101).
Personalmente me la trae al fresco que M$ quiera olvidar esas funciones que fincionan perfectamente y forman parte del estándar (palabra que M$ desconoce).
Título: Cómo Extraer Datos De Un *.txt
Publicado por: CoLSoN2 en 08 de Julio de 2005, 05:40:28 PM
 
Cita de: "sés"Personalmente me la trae al fresco que M$ quiera olvidar esas funciones que fincionan perfectamente y forman parte del estándar (palabra que M$ desconoce).
Por lo que parece..
CitarOpen a file. These functions are deprecated because more secure versions are available; see fopen_s, _wfopen_s.

Ahí tienes el porqué, pero vamos, en cuanto a ceñirse al estandar, el 2005 es el que mejor compatibilidad tiene de todos los compiladores de MS (otra cosa es que suelte warnings).
Título: Cómo Extraer Datos De Un *.txt
Publicado por: J_F_NASH en 08 de Julio de 2005, 05:40:58 PM
 Ok gracias.

"Además, a todos los anticuados de por aquí os digo, que en el VS2005 todas estas mariconadas de manejo de ficheros de stdio.h (como fopen) y de cadenas de string.h (como strcpy) están marcadas como deprecated (soltando un bonito warning 4101)."

1) ¿Cómo me entero que librerias son antiguas y cuales actuales?
If (C == antiguo && C++ == actualizado){
  cout << "¿Donde hay una referencia de esta librería?"
}

3) ¿VS2005 no es el VS.NET, es recomendable para un novato?



S2.
Título: Cómo Extraer Datos De Un *.txt
Publicado por: CoLSoN2 en 08 de Julio de 2005, 06:04:00 PM
 El IDE del VC 2005 (que sería el Visual C 8) es casi el mismo que el .NET (que sería 7 o 7.1, depende de la versión) y muy parecido al del 6, así que no creo que tengas problemas. Lo único es que quizás al principio hagas cosas que el 6 te deja porque se pasa el estandar por los cojones, y te preguntes por qué da un error. Además la implementación de Microsoft de la STL del 2005 (y del 7.1) es infinitamente mejor que la del 6, que es una basura.

"1) ¿Cómo me entero que librerias son antiguas y cuales actuales?"

Cuando uses algo que MS marca como "deprecated", ya te soltará un warning.
Título: Cómo Extraer Datos De Un *.txt
Publicado por: J_F_NASH en 08 de Julio de 2005, 08:08:39 PM
 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

Título: Cómo Extraer Datos De Un *.txt
Publicado por: AgeR en 08 de Julio de 2005, 09:17:52 PM
 El mejor consejo que puedo darte es que o bien te compres un libro y te empapes bien, o te apuntes a algunas clases presenciales, que al menos te darán unas bases de programación.

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.  ;)  
Título: Cómo Extraer Datos De Un *.txt
Publicado por: vicho en 08 de Julio de 2005, 09:21:02 PM
 por eso mismo ese warning es ignorado en mis proyectos xDDD
Título: Cómo Extraer Datos De Un *.txt
Publicado por: Pogacha en 08 de Julio de 2005, 09:24:37 PM
 Suena como que quieres poner un #include
Pon en el archivo cpp #include "archivo.txt" y hará que cuando compile lea el archivo como si estuviese insertado en ese lugar.

un #define define una constante en tiempo de compilación, los archivos se abren con open en tiempo de ejecución.

No parece que sepas la diferencia entre tiempo de ejecución o tiempo de compilación.

Saludos.

PD: Post cruzado con CoLSoN2
Título: Cómo Extraer Datos De Un *.txt
Publicado por: CoLSoN2 en 08 de Julio de 2005, 09:25:27 PM
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.
Título: Cómo Extraer Datos De Un *.txt
Publicado por: J_F_NASH en 09 de Julio de 2005, 08:45:54 AM
 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.
Título: Cómo Extraer Datos De Un *.txt
Publicado por: CoLSoN2 en 09 de Julio de 2005, 10:20:45 AM
 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á.
Título: Cómo Extraer Datos De Un *.txt
Publicado por: J_F_NASH en 09 de Julio de 2005, 12:23:37 PM
 "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.
Título: Cómo Extraer Datos De Un *.txt
Publicado por: DraKKaR en 09 de Julio de 2005, 12:59:15 PM
 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.
Título: Cómo Extraer Datos De Un *.txt
Publicado por: J_F_NASH en 09 de Julio de 2005, 03:26:06 PM
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.  
Título: Cómo Extraer Datos De Un *.txt
Publicado por: Warchief en 09 de Julio de 2005, 04:01:32 PM
 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)
Título: Cómo Extraer Datos De Un *.txt
Publicado por: Warchief en 09 de Julio de 2005, 04:11:56 PM
 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

Título: Cómo Extraer Datos De Un *.txt
Publicado por: TheAzazel en 09 de Julio de 2005, 04:52:53 PM
 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!
Título: Cómo Extraer Datos De Un *.txt
Publicado por: DraKKaR en 09 de Julio de 2005, 04:58:28 PM
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);

Título: Cómo Extraer Datos De Un *.txt
Publicado por: Warchief en 09 de Julio de 2005, 05:03:29 PM
 
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);
 }
}
Título: Cómo Extraer Datos De Un *.txt
Publicado por: Pogacha en 09 de Julio de 2005, 06:40:22 PM
 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.
Título: Cómo Extraer Datos De Un *.txt
Publicado por: Warchief en 09 de Julio de 2005, 10:06:08 PM
 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.
Título: Cómo Extraer Datos De Un *.txt
Publicado por: Douch en 09 de Julio de 2005, 10:13:07 PM
 Pasate por aquí C con Clase, tiene un curso de C++ bastánte majo.