[Tutorial] Salvamento de Dados (Sem includes)
#1

Criando um Sistema de Salvamento com as Nativas do SA:MP (Sem Include)


Нndice

Introduзгo
  • O que й uma nativa?
  • Porque usar esse sistema de salvamento?
Nativas do SA:MP
  • fopen
  • fwrite
  • fread
  • fclose
  • fremove
Sscanf e as Nativas
  • Baixando sscanf
  • Como sscanf serб ъtil?
  • Lendo Linha por Linha
  • Aplicando sscanf e fread
Introduзгo

O que й uma nativa?

Nativas sгo funзхes que nгo se encontram no arquivo .pwn, mas sim em alguma .dll ou algum outro arquivo. Й comum vermos nativas nos plugins baixados (Um exemplo serб o sscanf, veremos mais pra frente) e nas includes do samp, como a a_samp e todas as outras

Vale lembrar que uma nativa sу terб funзгo se dentro da pasta do seu servidor ou em alguma subpasta estiver o arquivo que contйm as funзхes de cada nativa, caso contrбrio o erro "File or function is not found" irб aparecer no console (Entendeu agora porque isso tem a ver com os plugins ? ). Caso queria fazer o teste, declare essa nativa no seu GameMode:

pawn Код:
native MinhaNativa();
E use ela em algum lugar do GM. Nгo irб ter erros de compilaзгo, mas tente ligar seu servidor para ver o que acontece


Por que usar esse sistema de salvamento?

Na verdade vocк pode usar o conhecimento que serб adquirido nesse tutorial para criar uma include INI ou algo totalmente inovador no quesito salvamento, e uma parte do que serб aprendido aqui tambйm estб disponнvel em outras linguagens, como C, que tambйm possui fopen, fwrite, entre outras.

Esse tutorial pode ser usado como base para outras linguagens no quesito salvamento, mas respondendo a pergunta do нndice dessa sessгo, nгo hб um motivo principal para usar esse sistema mais "bruto" de salvamento, na realidade, й mais prбtico usar um sistema INI que esse, mas todo sistema INI precisa usar essas funзхes para funcionar

Nativas do SA:MP

fopen

File Open, abreviado para fopen, й a funзгo que ira abrir o arquivo e й necessбrio uma variбvel do tipo File que irб armazenar o arquivo. Essa funзгo й a mais bбsica de todas, ela й necessбria para poder manipular os arquivos, e ela pode crashar o servidor dependendo do tipo de abertura que iremos fazer. As aberturas sгo:
  • io_write - Serve para criar e escrever em um Arquivo.
  • io_append - Serve para criar ou escrever em um arquivo
  • io_read - Serve para ler os dados que estгo dentro do arquivo
  • io_readwrite - Ler ou criar o arquivo
Й necessбrio usar a abertura correta para cada tipo de arquivo, e saber das "regrinhas" de cada um, por exemplo, usar io_read em um arquivo que nгo existe, irб crashar o servidor.

Resumindo tudo que eu falei:

pawn Код:
new
    File:Arquivo = fopen ( "Arquivo.txt" , io_write ); //vamos criar o arquivo ;)

fwrite

File Write (Escrever no Arquivo), abreviado para fwrite, tem como funзгo escrever no arquivo, a partir do ъltimo caractere, ou seja, se nгo usarmos quebra de linha (ou escape, \r\n) tudo ficarб na mesma linha e MUITO complicado de entender. Essa funзгo possui 2 parвmetros:

File: handle
const string[]

E fica meio уbvio o que cada um significa, nй? O primeiro parвmetro usa aquela variбvel do tipo File criada na sessгo anterior como arquivo, ou seja, sem aquela variбvel nгo й possнvel escrever nos arquivos.

Como eu disse, й necessбrio uma quebra de linha \r\n para o arquivo ficar cada informaзгo em uma linha (como os tradicionais INI), entгo o ideal do uso do fwrite seria:

PS: \r faz com que o cursor volte para o comeзo da linha (Bem lembrado Willian)

pawn Код:
//OBS: Nгo teste esse cуdigo, porque nгo ira aparecer nada no arquivo, veja fclose para entender :mrgreen:
new
    File:Arquivo = fopen ( "Arquivo.txt" , io_write ); //vamos criar o arquivo, e permitir escrever nele ;)

fwrite ( Arquivo , "Essa й a primeira linha\r\n" );
fwrite ( Arquivo , "Essa й a segunda linha :)");
fread

File Read (Ler o Arquivo), abreviado para fread, tem a funзгo de ler o que estб escrito em determinado arquivo. Possui dois parвmetros obrigatуrios e dois opcionais, apesar de parecer precisar apenas de um:

File: handle
string[]

Novamente, vamos precisar daquela variбvel criada na sessгo fopen para ser usada como arquivo. O parвmetro que deve estar deixando algumas pessoas confusas й o string, mas ele й muito importante . Essa string[] serб preenchida por uma variбvel que armazenarб a linha que estб sendo lida, esse conceito й importante, quando falarmos sobre sscanf irгo entender.

fclose

File Close (Fechar o Arquivo), abreviado para fclose, tem a funзгo de salvar e fechar, por isso que caso nгo usemos essa funзгo depois de escrever no arquivo nada ira aparecer nele (Vocк que pulou para esta sessгo depois de ler fwrite, entendeu agora?). Possui apenas um parвmetro, que й a variбvel que contйm o arquivo (Criada em fopen).

fremove

File Remove (Remover o Arquivo), abreviado para fremove, й parecido com fclose, possui apenas um parвmetro, porйm ao invйs de fechar, irб deletar o arquivo. Nгo tem muito o que falar sobre ele.

Sscanf e as Nativas

Baixando sscanf

Todo o conteъdo que serб necessбrio para esse tutorial estб disponнvel no tуpico oficial do Sscanf (By ******)

Como sscanf serб ъtil?

Como todos sabem (ou deveriam saber o.O), sscanf separa uma string em strings menores, tendo como base o espaзo. Para criar um sistema de salvamento, por exemplo, podemos usar as linhas assim:
  • Senha forumsamp
  • Dinheiro 2147483648
  • Score 2424 //Em Homenagem ao AlieN_.
Que Sscanf irб separar o nome do parвmetro com o valor dele. Apesar de parecer complicado, isso й extremamente simples, e um famoso Game Mode usa esse sistema de salvamento, o PPC_Trucking (Ou "GM de Caminhoneiro"), entгo quem tem esse gamemode e quer adicionar coisas novas e que sejam "salvбveis"й interessante ler esse tutorial, ou, ao menos, essa parte do sscanf.

Lendo Linha por Linha

A prуpria wiki explica o Line-by-Line, e por ser muito simples vou mostrar apenas o cуdigo, se alguйm tiver dъvidas quanto a isso basta colocar no tуpico que eu ponho a explicaзгo aqui

pawn Код:
new
    File:Arquivo = fopen ( "Arquivo.txt" , io_read ),
    String [ 100 ]; //Aqui tem que ser io_read, afinal, iremos ler o cуdigo

while ( fread ( Arquivo , String ) )
{
    //Funзхes, faremos na prуxima (e ъltima) sessгo
}

fclose ( Arquivo );
Resumidamente, isso cria um loop que ira ler todo o arquivo, atй nгo ter mais o que ser lido.

Aplicando sscanf e fread

Agora que temos o conceito bбsico de sscanf, fread e Linha-por-Linha, podemos finalmente fazer o salvamento (Essa serб a sessгo mais longa, se ajeite na cadeira e bons estudos).


O source que temos atй agora й:

pawn Код:
new
    File:Arquivo = fopen ( "Arquivo.txt" , io_read ),
    String [ 100 ]; //Aqui tem que ser io_read, afinal, iremos ler o cуdigo

while ( fread ( Arquivo , String ) )
{
    //Funзхes, faremos na prуxima (e ъltima) sessгo
}

fclose ( Arquivo );
Faltou apenas as funзхes. Quem leu meu tutorial Strcmp (OnPlayerCommandText) e Sscanf jб deve ter alguma noзгo da aplicaзгo que eu irei fazer do sscanf.

O Fread guarda as informaзхes de cada linha na variбvel string, que a cada nova "rodada" do loop irб ser trocada pela nova linha. Esse linha й composta por duas strings, sendo que uma delas pode ser numйrica, mas de momento vamos assumir que ambas sгo strings:

pawn Код:
new
    File:Arquivo = fopen ( "Arquivo.txt" , io_read ),
    String [ 100 ],
    NomeLinha [ 50 ],
    Valor [ 50 ]; //Aqui tem que ser io_read, afinal, iremos ler o cуdigo

while ( fread ( Arquivo , String ) )
{
    sscanf ( String , "s[100]s[50]" , NomeLinha , Valor );
}

fclose ( Arquivo );
Agora temos separados, por exemplo, essas duas strings:

Senha
minhasenha123

Agora temos que verificar se o nome da linha estб correto (strcmp) para setarmos o Valor (format)

pawn Код:
new
    File:Arquivo = fopen ( "Arquivo.txt" , io_read ),
    String [ 100 ],
    NomeLinha [ 50 ],
    Valor [ 50 ]; //Aqui tem que ser io_read, afinal, iremos ler o cуdigo

while ( fread ( Arquivo , String ) )
{
    sscanf ( String , "s[100]s[50]" , NomeLinha , Valor );

    if ( !strcmp ( NomeLinha , "Senha" ) )
        format ( Senha [ playerid ] , 50 , "%s" , Valor );
}

fclose ( Arquivo );
Nгo entendeu a lуgica? Leia de novo, se a dъvida persistir pergunte-me no tуpico.


Mas agora vocк deve estar se perguntando: Ok, mas e quando for nъmeros? Como eu faзo? Muitos devem ter pensado em colocar %d ou %i, mas isso nгo irб funcionar. PS: Nгo tive palavras para explicar o porque, mas talvez vendo os cуdigo vocк entenda.

Existe uma funзгo chamada strval, ela faz com que uma string (Que seja composta apenas por nъmeros) vire nъmero, entгo:

strval("123456");

Irб retornar 123456, como valor numйrico. Entгo basta usar:

pawn Код:
new
    File:Arquivo = fopen ( "Arquivo.txt" , io_read ),
    String [ 100 ],
    NomeLinha [ 50 ],
    Valor [ 50 ]; //Aqui tem que ser io_read, afinal, iremos ler o cуdigo

while ( fread ( Arquivo , String ) )
{
    sscanf ( String , "s[100]s[50]" , NomeLinha , Valor );

    if ( !strcmp ( NomeLinha , "Senha" ) )
        format ( Senha [ playerid ] , 50 , "%s" , Valor );

    if ( !strcmp ( NomeLinha , "Dinheiro" ) )
        Dinheiro [ playerid ] = strval ( Valor ); //String convertida para nъmero ;)
}

fclose ( Arquivo );
__________________________________________________ ____________

Esse tutorial й um pouco complexo, talvez algo nгo fique muito bem entendido. Qualquer dъvida/sugestгo/correзгo de algum erro basta escrever aqui no tуpico

Abraзos
Reply
#2

Fiquei com preguiзa de ler pra car%#!@.
Mais coisa vindo de vocк sei que estб bom...
]
Reply
#3

Quote:
Originally Posted by ThuuGLif3
Посмотреть сообщение
Fiquei com preguiзa de ler pra car%#!@.
Mais coisa vindo de vocк sei que estб bom...
]
Vlw haha

Tambйm deu uma preguiзa do car@|#* quando eu fui chegando no fim do tutorial, mas dai eu parei e continuei fazendo
Reply
#4

Dei uma lida rбpida, muito bacana, vocк tб sabendo como manter a organizaзгo.

A respeito do tutorial em si, parei de ler aqui:
pawn Код:
fwrite ( Arquivo , "Essa й a primeira linha\n" );
fwrite ( Arquivo , "Essa й a segunda linha :)");
OBS: A quebra de linha no Windows й feita atravйs de '\r\n', pois vocк precisa regredir o cursor para o inicio da linha, para depois poder quebrar a linha. Ou seja, deste jeito ele nгo quebraria uma linha no arquivo.

Abraзos !
Reply
#5

Belo tutorial!
Reply
#6

Quote:
Originally Posted by Willian_Luigi
Посмотреть сообщение
Dei uma lida rбpida, muito bacana, vocк tб sabendo como manter a organizaзгo.

A respeito do tutorial em si, parei de ler aqui:
pawn Код:
fwrite ( Arquivo , "Essa й a primeira linha\n" );
fwrite ( Arquivo , "Essa й a segunda linha :)");
OBS: A quebra de linha no Windows й feita atravйs de '\r\n', pois vocк precisa regredir o cursor para o inicio da linha, para depois poder quebrar a linha. Ou seja, deste jeito ele nгo quebraria uma linha no arquivo.

Abraзos !
Bem lembrado, esqueci desse detalhe no tutorial

#Corrigido
Reply
#7

Vale lembrar que se vocк abre um arquivo via io_write, todo o conteъdo do mesmo й apagado antes da escrita.
Reply
#8

"Criando um Sistema de Salvamento com as Nativas do SA:MP (Sem Include)"

Eu pensei que vocк iria ensinar somente com as funзхes do file.inc, ai de cara vocк coloca que vai usar sscanf, rs.

anyway, й um bom tutorial. Parabйns !!
Reply
#9



+pertubassum pra vc! rз
Reply
#10

Gostei do tutorial, eu nгo tive a vontade de ler agora, amanha eu dou uma analisada.
+rep.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)