Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Zeigon en 25 de Mayo de 2003, 05:20:18 PM

Título: como manejar archivos facilmente??
Publicado por: Zeigon en 25 de Mayo de 2003, 05:20:18 PM
                                como puedo manejar en C++ archivos q tengan texto de manera rápida y cómoda?
por ejemplo teniendo esto en un fichero de texto q tenga los datos del juego:



Escenario casa:

 imagen="images/casa/fondo.jpg"



 objetos:

    sillon="images/casa/objs/sillon.jpg"

    telefono="images/casa/objs/telefono.jpg"



etc....



como hago q desde el programa pille sólo lo q es la dirección a la imagen. yo había pensado en un getw, hasta encontrar el nombre del escenario q se busca, y a partir de ahí la palabra objetos -> nombre objeto, y al llegar a lo q se busca ya no sé como hacerlo. quiero decir, un getw, coge una palabra, no? pero q toma como palabra, lo q está separado por espacios o q?

como tendría q hacer para coger sólo lo q hay desde las primeras " hasta las otras ". lo q es la dirección de la img.

hay alguna librería o forma de facilitar esto? q me parece un poco un trabajo de chinos.

venga, gracias                                
Título: como manejar archivos facilmente??
Publicado por: ShAq en 25 de Mayo de 2003, 11:21:11 PM
                                Podrias utilizar archivos .ini
si quieres mirate esta clase muy util y facil de utilizar
http://www.stratos-ad.com/forums2/viewtopic.php?t=1471

Saludos                                
Título: como manejar archivos facilmente??
Publicado por: ethernet en 26 de Mayo de 2003, 11:14:06 AM
Primero debes poner una gramática, no puedes poner frases sin ningún orden, eso sería inviable. Por poner un ejemplo en el fichero ini que te comentan sería:

[sección]

nombre_variable = valor
nombre_variable2 = valor2

[sección2]

....

Con eso ya sabes q tienes q buscar primero una sección (saltándote líneas en blanco etc, hasta encontrar una), después buscar variables, así sucesivamente.

saludos
Título: XML
Publicado por: ZeruGiran en 26 de Mayo de 2003, 10:28:15 PM
                                Lo que tu necesitas ya esta hecho y se llama XML

Lo mejor es que hay librerias (algunas libres) para parcear XML

Seria algo asi:



<esenario Nombre ="casa">

<imagen>images/casa/fondo.jpg</imagen>

<objetos>

 <objeto nombre="sillon">images/casa/objs/sillon.jpg</objeto>

 <objeto nombre="telefono">images/casa/objs/telefono.jpg</objeto>

</objetos>

</esenario>



Ya te digo, lo interesante es que ya hay mucho codigo hecho que te entenderia perfectamente un archivo formado mas o menos asi.                                
Título: Sobre XML
Publicado por: mourules en 27 de Mayo de 2003, 08:34:10 AM
                                ¿Que librería recomendáis para el tema del XML?

Mi intención es tener una multi-plataforma y sencilla. He probado tinyXML, conocéis otra mejor?                                
Título: como manejar archivos facilmente??
Publicado por: samsaga2 en 27 de Mayo de 2003, 08:47:30 AM
                                Yo uso http://expat.sourceforge.net/ que si no recuerdo mal es la que usa Mozilla (vamos, se creo basicamente para usarse con el Mozilla).                                
Título: como manejar archivos facilmente??
Publicado por: Zeigon en 27 de Mayo de 2003, 05:44:01 PM
                                justo preguntaba por algo así, pq justo... lo vi en el motorcillo de samsaga2  :P

gracias                                
Título: como manejar archivos facilmente??
Publicado por: ethernet en 27 de Mayo de 2003, 07:31:43 PM
Me parece una gran parida usar un formato como XML, a mi modo de ver desmesurado para una persona que empieza y/o un proyecto de un juego que su fin principal no es tener un mega fichero de configuración. No merece la pena perder el tiempo en eso. Creo q un gran fallo de la gente q programa q todos cometemos es perder mucho el tiempo en cosas de este estilo; archivos de configuracioon, lenguajes de script, motores 3d con miles de cosas q despues no aplicas, filesystems, memory managers, blablablabla  que despues es como tener una cuadra llena de rosales. Desde mi punto de vista primero hay q centrarse en lo q hay q centrarse y despues ya optimizaciones y pijaditas q nos/les gustan tanto a los coders



saludos
Título: como manejar archivos facilmente??
Publicado por: Zeigon en 27 de Mayo de 2003, 08:39:04 PM
                                :(  jo, ya me has hecho dudar en q hacer. el caso es q tenía yo una mini función para buscar en ficheros, q todavía no he probado pero q está muy maja y facilona, pero q tengo q mejorarla un pokillo para q tenga más funcionalidad. el caso es q venía buscando alguna librería o algo así hecho para no tener q currarmelo, pero vamos...

supongo q has querido decir q hay mil cosas hechas y q es mejor pillarse algo hecho q ponerse a hacer algo nuevo (esto lo saco de otros posts en q has dicho mas menos lo mismo). de todas formas como sólo he tenido esta respuesta y me cuentas q no es muy allá, pues como q voy a hacer lo q estaba haciendo y seguiré con mi mini buscador.

q ya puestos, a ver q os parece la versión temprana:


short cFileMgr::search_in_file(FILE* data_file, char* search)

{

char * cadena;



while( ! (feof(pdata_file) || ferror(pdata_file)) )

{

 *cadena = getw(pdata_file);



 if (cadena == search)

 {

  return 1; //Si encuentra lo que se busca se pira y se vuelve a donde se llamó a la función

 }   //Además coloca el puntero en la posición donde encontró lo q se busca

}



return 0; //Si no encuentra lo que se busca se devuelve un cero (false)

}

                               
Título: como manejar archivos facilmente??
Publicado por: ethernet en 27 de Mayo de 2003, 09:06:29 PM
si tu quieres hacerte un fichero de configuracion en XML hazlo, simplemente es mi opinion acerca de XML, sistemas de script etc ;)

Por otro lado yo me cargaria todo el fichero en memoria y buscaria:

std::string s;
load_file_in_string(file,&s);
s.find....(cadena a buscar); XD


saludos
Título: como manejar archivos facilmente??
Publicado por: deadLock++ en 28 de Mayo de 2003, 12:29:15 AM
                                Yo he realizado una clase que parsea un archivo INI utilizando métodos virtuales para obtener la información en él contenida. Se usa de manera muy sencilla:



class MiIniFile : public IniFile

{

public:

MiIniFile() {}

MiIniFile(const char * pszName) : IniFile(pszName) {}



virtual void OnSectionIn(const char * pszSection)

{

 cout << "OnSectionIn: " << pszSection << endl;

}

virtual void OnSectionOut(const char * pszSection)

{

 cout << "OnSectionOut: " << pszSection << endl;

}



virtual void OnComment(const char * pszCommentText)

{

 cout << "OnComment: " << pszCommentText << endl;

}



virtual void OnOptionString(const char * pszOptionName, const char * pszValue)

{

 cout << "OnString: " << pszOptionName << " / " << pszValue << endl;

}

virtual void OnOptionInteger(const char * pszOptionName, int iValue)

{

 cout << "OnInteger: " << pszOptionName << " / " << iValue << endl;

}

virtual void OnOptionFloat(const char * pszOptionName, float fValue)

{

 cout << "OnFloat: " << pszOptionName << " / " << fValue << endl;

}

virtual void OnOptionHex(const char * pszOptionName, unsigned long ulValue)

{

 cout << "OnHex: " << pszOptionName << " / " << ulValue << endl;

}



virtual void OnOptionMultipleInteger(const char * pszOptionName, int iCount, int aiValue[])

{

 cout << "OnOptionMultipleInteger: " << pszOptionName << " / " << iCount << endl;

 for(int i=0; i<iCount; i++)

  cout << "value(" << i << "): " << aiValue[i] << endl;

}



virtual void OnOptionMultipleFloat(const char * pszOptionName, int iCount, float afValue[])

{

 cout << "OnOptionMultipleFloat: " << pszOptionName << " / " << iCount << endl;

 for(int i=0; i<iCount; i++)

  cout << "value(" << i << "): " << afValue[i] << endl;

}

};



Simplemente creas una clase que herede de IniFile y luego recibes cada uno de los valores encontrados reconociendo entre: strings, números enteros, números flotantes, números hexadecimales (ej: 0xff00), series de números enteros (ej: OPCION=1 3 2 4) y serie de números flotantes.

Cuando se entra en una sección se invoca el método OnSectionIn con el nombre correspondiente y cuando la abandonas (por haber entrado en otra) se invoca el método OnSectionOut.

Es un método muy eficiente debido a que el archivo de config. se lee sólo una vez.

La clase IniFile puede tomar como entrada un archivo, un stream o un buffer de memoria (ideal para usos con zlib).

Si a alguien le interesa la mando.                                
Título: como manejar archivos facilmente??
Publicado por: Zaelsius en 28 de Mayo de 2003, 10:26:21 AM
                                Es interesante, pon un ejemplo o un link para bajarla... 8)                                
Título: como manejar archivos facilmente??
Publicado por: deadLock++ en 28 de Mayo de 2003, 03:53:33 PM
                                Bueno, esta es al URL donde se pueden descargar el proyecto:

http://www.dedalus-software.com.ar/files/c.../configFile.zip

Compila tanto en Visual C++ 6.0 como en .NET. En el main ejemplifica su uso tanto para archivo como para buffer (descomentariar el que corresponda).

La clase principal es IniFile (IniFile.h e IniFile.cpp) pero tiene dependencias a algunas funciones de soporte que hice y están en functions.cpp (funciones para sacar espacios por derecha e izquierda, convertir asciihex a unsigned long y safestrcpy).

Espero que le sirva a alguien.

Saludos.                                
Título: como manejar archivos facilmente??
Publicado por: ethernet en 30 de Mayo de 2003, 10:38:02 PM


#include "stdafx.h"



namespace conf

{

   typedef  std::string st;

   typedef  st::size_type sz_t;

   typedef  std::map<st,st> Vars;

   typedef  std::map<st,Vars> ini_t;

   typedef  const st c_st;

   typedef  char const * const ccc;

   

   enum { BUFF = 256 , CTAG = ';'};  



   class IniFile: public ini_t

   {  

           typedef  std::vector<st> ArgList;        

           bool isws (char c,ccc wstr){return strchr(wstr,c)!=0;}

           st trim(c_st &s,sz_t &idx,ccc ws= " "){

               sz_t i = s.find_first_not_of(ws,idx);

               sz_t j = idx = s.find_first_of(ws,i);

               return st(s.substr(i,j-i));

             

           }

           void stk (ArgList &l,c_st &s,ccc ws = " rtn"){

               sz_t i = 0;l.clear();

               while (i<s.size())l.push_back(trim(s,i,ws));  

           }

       public:

           IniFile(ccc f= 0){ if(f)readvars(f); }

           bool readvars(c_st& file)

           {

               char b[BUFF];

               st secc;

               ArgList a;

               ifstream f(file.c_str(),ios::in|ios::nocreate);

               f.getline(b,BUFF);        

               while(f.good())

               {              

                   stk(a,b," trn=");

                   if(a.size() && a[0][0]!=CTAG)

                        if(a[0][0]=='[') secc=a[0].substr(1,a[0].size()-2);              

                        else   (*this)[secc][a[0]]=a[1];      

                   f.getline(b,BUFF);        

               }

               return f.bad();

           }

   };

};

int main(int argc, char* argv[])

{

   conf::IniFile a("1.ini");

   

   cout << a["holas"]["hola"].c_str() << endl;

   cout << a["juego"]["var"].c_str() << endl;

   

return 0;

}



Estaba aburrido :/
PD.la funciona isws no se nisiquiera si la uso xDD
Título: como manejar archivos facilmente??
Publicado por: Zeigon en 30 de Mayo de 2003, 11:59:38 PM
                                jejeje demasiao pa mí.

creo q al final inventaré (aunque seguro q ya está hecho en alguna parte) mi sistemilla, más sencillote q todos estos.

vaya conmigo, veo mucha línea de código, y sin intentar entenderlo, ya creo q es difícil  :jaja: