[Include] file_system - Fбcil lector de datos.
#1

file_system v2.0 (25/12/2014)

Introducciуn:
file_system es un include creado por mн que lee informaciуn de cualquier archivo de cualquier extensiуn mucho mбs rбpido que Dini o SII (aunque desconozco si lee mas rбpido que Y_Ini), pues su uso es bastante sencillo pero rбpido y eficaz.


  • Funcionamiento:
El include solo puede manejar 1 archivo abierto a la vez. Cuando lo abre, lo mantiene abierto y lee los datos mientras almacena los mismos, luego de que haya terminado se lo cierra de forma manual. Lo mismo sucede si se intenta escribir en йl.


  • Funciones:
Desde la v2.0 el include tiene 11 funciones, ademбs de tener aсadido el parбmetro store, para arreglar el bug de que el include no leнa correctamente los valores.


pawn Код:
native File_Create(location[]);
native File_Open(location[], open_mode);
native File_Close();
                       
native File_WriteStr(name[], value[]);
native File_WriteInt(name[], value);
native File_WriteFloat(name[], Float:value);
native File_WriteBool(name[], bool:value);
 
native File_ReadStr(name[], store[]);
native File_ReadInt(name[], &store);
native File_ReadFloat(name[], &Float:store);
native File_ReadBool(name[], &bool:store);
           

// Definirб la longitud mбxima que se podrб leer de un archivo (ojo, no todo el archivo, solo una lнnea).
#define FILE_MAX_STRING 50

  • Ejemplo de uso:
Este es un simple sistema de registro y logueo:

pawn Код:
#include <a_samp>
#define File_MAX_STRING 25
#include <file_system>

#define DIALOG_REGISTER 100
#define DIALOG_LOGIN 101


enum PlayerInfoEnum
{
    Kills,
    Deaths,
    Float:Health,
    AdminLevel
};
static PlayerInfo[MAX_PLAYERS][PlayerInfoEnum];
static PasswordPlayer[MAX_PLAYERS][50];
static LocationUser[MAX_PLAYERS][32];


public OnPlayerConnect(playerid)
{
    new Nick[MAX_PLAYER_NAME];
    GetPlayerName(playerid, Nick, sizeof(Nick));

    format(LocationUser[playerid], 32, "users/%s.txt", Nick);
    if(!fexist(LocationUser[playerid])) ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registrar.", "Introduce una contraseсa.", "Aceptar", "");
    else
    {
        ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Identificarse.", "Introduce tu contraseсa.", "Aceptar", "");
        File_Open(LocationUser[playerid], io_read)
        {
            File_ReadStr("Password", PasswordPlayer[playerid]);
            File_Close();
        }
    }
    return 1;
}


public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case DIALOG_REGISTER:
        {
            if(!response) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registrar.", "Introduce una contraseсa.", "Aceptar", "");
           
            File_Create(LocationUser[playerid]);
            File_WriteStr("Password", inputtext);
            File_WriteFloat("Health", 0.0);
            File_WriteInt("Kills", 0);
            File_WriteInt("Deaths", 0);
            File_WriteInt("Money", 0);
            File_WriteInt("AdminLevel", 0);
            File_Close();
            // Aquн no serб necesario usar 'File_Open' ya que cuando usamos 'File_Create' el archivo se abriу en modo de escritura pero no se cerrу.
           
            format(PasswordPlayer[playerid], 49, "%s", inputtext);
            SendClientMessage(playerid, 0x00FF00AA, "[CUENTA] Bienvenido, gracias por registrarse.");
        }
        case DIALOG_LOGIN:
        {
            if(!response) return ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Identificarse.", "Introduce tu contraseсa.", "Aceptar", "");
            if(strcmp(PasswordPlayer[playerid], inputtext) == 0)
            {
                File_Open(LocationUser[playerid], io_read)
                {
                                        new Float:health, money;
                    File_ReadStr("Password", PasswordPlayer[playerid]); // Es necesario leer otra vez la contraseсa.
                    File_ReadFloat("Health", health);
                    File_ReadInt("Kills", PlayerInfo[playerid][Kills]);
                    File_ReadInt("Deaths", PlayerInfo[playerid][Deaths]);
                    File_ReadInt("Money", money);
                    File_ReadInt("AdminLevel", PlayerInfo[playerid][AdminLevel]);
                    File_Close();
                }
            }
            else return ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Identificarse.", "Contraseсa incorrecta. Por favor, introduzca la correcta.", "Aceptar", "");
        }
    }
    return 1;
}
           
           
public OnPlayerDeath(playerid, killerid, reason)
{
    if(IsPlayerConnected(killerid)) PlayerInfo[killerid][Kills] ++;
    if(IsPlayerConnected(playerid)) PlayerInfo[playerid][Deaths] ++;
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    GetPlayerHealth(playerid, PlayerInfo[playerid][Health]);
   
    File_Open(LocationUser[playerid], io_write)
    {
        File_WriteStr("Password", PasswordPlayer[playerid]);
        File_WriteFloat("Health", PlayerInfo[playerid][Health]);
        File_WriteInt("Kills", PlayerInfo[playerid][Kills]);
        File_WriteInt("Deaths", PlayerInfo[playerid][Deaths]);
        File_WriteInt("Money", GetPlayerMoney(playerid));
        File_WriteInt("AdminLevel", PlayerInfo[playerid][AdminLevel]);
        File_Close();
    }
    return 1;
}

  • F.A.Q:
Todo acerca sobre los archivos: https://sampforum.blast.hk/showthread.php?tid=511650 (pero recomendarнa leer acerca de fopen)


  • Pruebas de velocidad:
pawn Код:
// 100 iteracciones - Abrir el archivo, leer 5 datos y cerrarlo.
13 milisegundos.
15 milisegundos.
14 milisegundos.

  • Descargas:
- Pastebin: http://pastebin.com/we18qecP.



Si tienen dudas, estoy aquн para responderlas.
Reply
#2

Se ve bueno
Reply
#3

Probarй a ver que tal, espero que no me decepciones
Reply
#4

Exelente trabajo.
Solo tengo una duda , por quй el nombre del include en inglйs?.
Reply
#5

Quote:
Originally Posted by Zume-Zero
Посмотреть сообщение
Se ve bueno
Quote:
Originally Posted by LeftHanded
Посмотреть сообщение
Probarй a ver que tal, espero que no me decepciones
Gracias chicos .

Quote:
Originally Posted by Diego316
Посмотреть сообщение
Exelente trabajo.
Solo tengo una duda , por quй el nombre del include en inglйs?.
Me gusta hacer los nombres de las funciones, y todo lo demбs en inglйs.

Saludos.
Reply
#6

No es por quererte a venir a joder el post pero esto a simple vista no funciona, que pasaria si intentas actualizar un dato? yo lo que veo ahн es que escribirнa un nuevo campo al final del documento en vez de remplazarlo o actualizar el dato, tu intento es bueno pero debes corregir ese error.
Reply
#7

Quote:
Originally Posted by Daniel-92
Посмотреть сообщение
No es por quererte a venir a joder el post pero esto a simple vista no funciona, que pasaria si intentas actualizar un dato? yo lo que veo ahн es que escribirнa un nuevo campo al final del documento en vez de remplazarlo o actualizar el dato, tu intento es bueno pero debes corregir ese error.
Cuando abres un archivo para escribir en йl, se borrarб todo el contenido que tiene adentro. Ahora, es mejor:

- Abrir un archivo.
- Guardar todos sus datos en una variable.
- Cerrar el archivo.
- Abrir el archivo nuevamente pero para escribir en йl.
- Escribir todos los datos almacenados + el dato que deseamos 'actualizar'.
- Cerrar el archivo.

O...

- Abrir el archivo.
- Escribir todos los datos con sus respectivos valores.
- Cerrar el archivo.


Otra cosa, si quieres escribir en donde termina el archivo se debe abrir el mismo en modo 'io_append'.

EDIT: Nice 666 posts.
Reply
#8

Ya te entendн para guardar un solo dato por ejemplo el score se tendria que guardar todo nuevamente, pero al ser usada solo cuando el jugador se desconecta el sistema funciona de manera eficiente, es una buena tйcnica.

PD: Ya habia hecho el post 666 hace rato pero parece que me borraron algunos comentario.
Reply
#9

Le he echado un vistazo al cуdigo. No creo que la funciуn "File_Str" vaya a funcionar correctamente...
Reply
#10

Quote:
Originally Posted by bm0z
Посмотреть сообщение
Le he echado un vistazo al cуdigo. No creo que la funciуn "File_Str" vaya a funcionar correctamente...
Arreglй ese error y ahora parece ser funcional, gracias
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)