Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





como manejar archivos facilmente??

Iniciado por Zeigon, 25 de Mayo de 2003, 05:20:18 PM

« anterior - próximo »

Zeigon

                                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                                
eigon
----------------------------------------------
El arca de Noe fue construida por amateurs.
El Titanic por profesionales.

ShAq

                                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                                

ethernet

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

ZeruGiran

                                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.                                

mourules

                                ¿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?                                

samsaga2

                                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).                                

Zeigon

                                justo preguntaba por algo así, pq justo... lo vi en el motorcillo de samsaga2  :P

gracias                                
eigon
----------------------------------------------
El arca de Noe fue construida por amateurs.
El Titanic por profesionales.

ethernet

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

Zeigon

                                :(  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)

}

                               
eigon
----------------------------------------------
El arca de Noe fue construida por amateurs.
El Titanic por profesionales.

ethernet

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

deadLock++

                                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.                                

Zaelsius

                                Es interesante, pon un ejemplo o un link para bajarla... 8)                                

deadLock++

                                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.                                

ethernet



#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

Zeigon

                                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:                                
eigon
----------------------------------------------
El arca de Noe fue construida por amateurs.
El Titanic por profesionales.






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.