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.
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;
}
fopen() ^_^
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).
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...
Pues ve pidiendo hora que con tanta cola de gays dentro de poco casarse va a ser casi imposible.
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.
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).
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).
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.
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.
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
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. ;)
por eso mismo ese warning es ignorado en mis proyectos xDDD
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
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.
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.
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á.
"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.
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.
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.
Aquí está el inifile de Zaelsius:
http://www.stratos-ad.com/forums/index.php...=15entry53271Un 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)
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
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!
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);
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);
}
}
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.
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.
Pasate por aquí
C con Clase, tiene un curso de C++ bastánte majo.