[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


Messages In This Thread

Forum Jump:


Users browsing this thread: 1 Guest(s)