16.07.2012, 19:48
(
Last edited by ipsBruno; 18/07/2012 at 09:14 PM.
)
bLines ou bLinhas
Finalmente "terminei de acabar" minha include de manipulaзгo de arquivos atravйs de linhas. Este sistema й muito similar aqueles sistemas de arquivos em INI, sу que este mйtodo й via o nъmero da linha.
Isto й, em vez de usar
pawn Code:
Bini_Set("oiamico1", 1)
Bini_Set("oiamico2", 2)
Bini_Set("oiamico3", 3)
Bini_Set("oiamico4", 4)
PHP Code:
oiamico1=1
oiamico2=2
oiamico3=3
oiamico4=4
PHP Code:
enum topogm {
oiamico1 // armazena id 0
oiamico2 // armazena id 1
oiamico3 // armazena id 2
oiamico4 // armazena id 3
}
File_SetInt(oiamico1, 1)
File_SetInt(oiamico2, 2)
File_SetInt(oiamico3, 3)
File_SetInt(oiamico4, 4)
pawn Code:
1
2
3
4
pawn Code:
// File_Isset(linha)
// File_Get(linha)
// File_GetFloat(linha)
// File_GetInt(linha)
// File_GetBool(linha)
// File_SetBool(linha, bool:valor)
// File_SetPersonal(linha, "format", var)
// File_SetInt(linha, Int:valor)
// File_SetFloat(linha, Float:valor)
// File_Set(linha, string[])
// File_Open(arquivo[])
// File_Save()
-----------------------
Exemplo de uso:
PHP Code:
File_Open("bruno.txt"); // abrir arquivo bruno.txt caso nгo existir o arquivo ele cria ..
File_SetInt(0, 1000); // escrever valor 1000 no arquivo na linha 1
File_SetFloat(1, 1.1031); // coloca um valor float lб
print(File_Get(1)); // mostra o que tem na linha 1
// NA NOVA VERSAO NAO PRECISA DE FILE_CLOSE
// File_Save() deve ser coloca em OnGameModeExit (assim como Bini e DOF2 !!)
Para funcionamento correto deve ser colocado File_Save() em OnGameModeExit ou OnFilterScriptExit.
Logo no arquivo bruno.txt seria escrito:
pawn Code:
1000
1.1031
A funзгo й:
PHP Code:
File_SetPersonal
File_SetPersonal(linha, "formatacao", VARIAVEIS);
EX:
File_SetPersonal(linha, "Inteiro: %d e Floats: %f", 100, 50.11);
Logo no arquivo seria escrito:
PHP Code:
"Inteiro: 100 e Floats: 50.11"
Enfim, estou com preguiзa de explicar um tutorial detalhado ..
------
Cуdigo da include:
Pastebin -> http://pastebin.com/9AtHBRri
PHP Code:
///////////////////////////////////////////////////////////////////////////////
//
//
// #### ######## ###### ######## ######## ### ## ##
// ## ## ## ## ## ## ## ## ## ### ###
// ## ## ## ## ## ## ## ## #### ####
// ## ######## ###### ## ###### ## ## ## ### ##
// ## ## ## ## ## ######### ## ##
// ## ## ## ## ## ## ## ## ## ##
// #### ## ###### ## ######## ## ## ## ##
//
//
// Criado por Bruno da Silva (iPs DraKiNs)
//
// Acesse meu blog sobre programaзгo http://www.brunodasilva.com.br
//
// Seja membro de nossa equipe de programaзгo
// http://ips-team.forumeiros.com/t2-inform...cao-na-ips
//
// [iPs]TeaM soluзхes de programaзгo em geral
//
//
// bLine Files (mais rбpido que bini)
//
//
// > Funзхes <
// File_Isset(linha)
// File_Get(linha)
// File_GetFloat(linha)
// File_GetInt(linha)
// File_GetBool(linha)
// File_SetBool(linha, bool:valor)
// File_SetPersonal(linha, "format", var)
// File_SetInt(linha, Int:valor)
// File_SetFloat(linha, Float:valor)
// File_Set(linha, string[])
// File_Open(arquivo[])
// File_Save() // apenas em onGameModeExit para fechar a include
//
//
//
/////////////////////////////////////////////////////////////////////////////////
// Configuraзхes
#define MAX_LINE_FILE 500
#define MAX_LINE_TEXT 500
#define MAX_FILE_NAME 064
// Definiзхes e Declaraзхes
stock
totalLines,
bool:fileOpen,
bool:fileWrited,
_filed[MAX_LINE_TEXT],
blineset[MAX_LINE_FILE],
fileOpenned[MAX_FILE_NAME],
bcache[MAX_LINE_FILE+1][MAX_LINE_TEXT+1];
#define File_Isset(%0) \
!!bcache[%0][0]
#define File_Get(%0) \
bcache[%0]
#define File_GetFloat(%0) \
floatstr(bcache[%0])
#define File_GetInt(%0) \
strval(bcache[%0])
#define File_GetBool(%0) \
!strcmp(bcache[%0], "true")
#define File_SetPersonal(%0,%1,%2) \
File_Set(%0, (format((_filed[0] = EOS, _filed), MAX_LINE_TEXT, %1, %2), _filed))
#define File_SetInt(%0,%1) \
File_SetPersonal(%0, "%d", %1)
#define File_SetFloat(%0,%1) \
File_SetPersonal(%0, "%f", %1)
// Funзхes
stock File_SetBool(line, bool:value) {
return value ? File_Set(line, "true") : File_Set(line, "false");
}
stock File_Set(line, value[]) {
if(line > totalLines) {
totalLines = line;
}
blineset[line] = 1;
return fileWrited = true, bcache[line][0] = EOS, strcat(bcache[line], value, MAX_LINE_TEXT);
}
static
totalContadoINIHASHFILE
;
stock File_HashStr(buffer[])
{
totalContadoINIHASHFILE = 0;
for(new i = strlen(buffer); i != -1; i--) {
totalContadoINIHASHFILE += buffer[i];
}
return totalContadoINIHASHFILE;
}
stock File_Open(file[])
{
if(fileOpen && File_HashStr(file) == File_HashStr(fileOpenned) && !strcmp(file, fileOpenned, false)) {
return true;
}
else {
File_Save();
}
static
f_i,
len,
File: f;
f = fopen(file, io_readwrite);
if(f) {
fileOpenned[0] = EOS;
strcat(fileOpenned, file, MAX_FILE_NAME);
f_i = 0;
while((len = fread(f, bcache[f_i]))) StripNewLine(bcache[f_i], len),++ f_i, blineset[f_i-1] = 1;
fclose(f);
fileOpen = true;
return totalLines = f_i, bcache[f_i +1][0] = EOS, 1;
}
return false;
}
stock File_Save()
{
if(fileWrited) {
if(fileOpenned[0]) {
static File: f, f_i, s_I;
f = fopen(fileOpenned, io_write );
{
f_i = 0;
while(f_i != totalLines +1) {
if(blineset[f_i]) {
s_I = strlen(bcache[f_i]);
StripNewLine(bcache[f_i], s_I);
strcat(bcache[f_i], "\r\n");
fwrite(f, bcache[f_i]);
blineset[f_i] = 0;
}
f_i++;
}
}
fclose(f);
fileOpenned = "";
return fileWrited = false, fileOpen = false, bcache[0][0] = EOS, totalLines = 0, fileOpenned[0] = EOS, true;
}
}
return false;
}
// By Draco Blue
stock StripNewLine(string[], len)
{
if (string[0]==0) return ;
if ((string[len - 1] == '\n') || (string[len - 1] == '\r')) {
string[len - 1] = 0;
if (string[0]==0) return ;
if ((string[len - 2] == '\n') || (string[len - 2] == '\r')) string[len - 2] = 0;
}
}
Aceito teste de quem quiser fazer, colocarei os crйditos
Crйditos:
Bruno da Silva
[iPs]TeaM © 2012
Changelog:
16/07/2012 - 21:20
Deu arrumei. Era problema no armazenamento de demasiadas linhas na memуria (superior a 500). Arrumei isto para que de fato as linhas inativas nгo ocupem espaзo na memуria. -
Agradecimentos: Paulo, doodem, DON_FAF, CidadeNovaRP por reportarem o BUG ..
16/07/2012 - 21:35
Foi aprimorado o sistema de caches da include !! Agora ela estб mais rбpida
Agora nгo existe mais File_Close() !! Veja o modo de uso lб encima
Velocidade:
Quote:
ESCRITA : bLines Time: 74 ms bini Time: 3519 ms DOF2 Time: 533 ms LEITURA: bLines Time: 54 ms bini Time: 59 ms DOF2 Time: 158 ms |
Code:
#include <a_samp> #include IPS/bini #include IPS/bline #include DOF2 public OnFilterScriptInit() { new tempo[3]; tempo[0] = GetTickCount(); for(new i; i != 10001; i++) { File_Open("Teste1_1.ini"); File_SetInt(0, 1000); } tempo[0] = GetTickCount()-tempo[0]; tempo[1] = GetTickCount(); for(new i; i != 10001; i++) { INI_Create("Teste2_1.ini"); INI_WriteInt("Teste2_1.ini", "Line", 1000); } tempo[1] = GetTickCount()-tempo[1]; tempo[2] = GetTickCount(); for(new i; i != 10001; i++) { DOF2_CreateFile("Teste3_1.ini"); DOF2_SetInt("Teste3_1.ini", "Line", 1000); } tempo[2] = GetTickCount()-tempo[2]; printf("ESCRITA : bLines Time: %i ms\nbini Time: %i ms\nDOF2 Time: %i ms", tempo[0], tempo[1], tempo[2]); new buff; tempo[0] = GetTickCount(); for(new i; i != 10001; i++) { File_Open("Teste1_1.ini"); buff = File_GetInt(0); } tempo[0] = GetTickCount()-tempo[0]; tempo[1] = GetTickCount(); for(new i; i != 10001; i++) { buff = INI_ReadInt("Teste2_1.ini", "Line"); } tempo[1] = GetTickCount()-tempo[1]; tempo[2] = GetTickCount(); for(new i; i != 10001; i++) { buff = DOF2_GetInt("Teste3_1.ini", "Line"); } tempo[2] = GetTickCount()-tempo[2]; printf("LEITURA : bLines Time: %i ms \nbini Time: %i ms \nDOF2 Time: %i ms ", tempo[0], tempo[1], tempo[2]); SendRconCommand(#exit); #pragma unused buff return true; } public OnFilterScriptExit() { File_Save(); DOF2_SaveFile(); INI_Save(); }
Foi aprimorado a seguranзa da include !! Agora ela estб mais segura
18/07/2012 - 17:52
Foi aprimorado a velocidade da include !! Agora ela estб mais rбpida !!
Atualizado o tуpico e o cуdigo as 18/07/2012 - 17:52 !! Atualize