Salvamento de Dados (Sem INIs) -
Juniiro3 - 08.10.2013
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:
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
Re: Salvamento de Dados (Sem includes) -
ThuuGLif3 - 08.10.2013
Fiquei com preguiзa de ler pra car%#!@.
Mais coisa vindo de vocк sei que estб bom...
]
Re: Salvamento de Dados (Sem includes) -
Juniiro3 - 08.10.2013
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
Re: Salvamento de Dados (Sem includes) -
WLSF - 08.10.2013
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 !
Respuesta: Salvamento de Dados (Sem includes) -
DanDRT - 08.10.2013
Belo tutorial!
Re: Salvamento de Dados (Sem includes) -
Juniiro3 - 08.10.2013
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
Re: Salvamento de Dados (Sem includes) -
zPain - 09.10.2013
Vale lembrar que se vocк abre um arquivo via
io_write, todo o conteъdo do mesmo й apagado antes da escrita.
Re: Salvamento de Dados (Sem includes) -
Falcon. - 09.10.2013
"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 !!
Re: Salvamento de Dados (Sem includes) -
AlieN_. - 09.10.2013
+pertubassum pra vc! rз
Re: Salvamento de Dados (Sem includes) -
Schocc - 09.10.2013
Gostei do tutorial, eu nгo tive a vontade de ler agora, amanha eu dou uma analisada.
+rep.