08.10.2013, 23:37
(
Последний раз редактировалось Juniiro3; 31.12.2013 в 15:23.
)
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?
- fopen
- fwrite
- fread
- fclose
- fremove
- Baixando sscanf
- Como sscanf serб ъtil?
- Lendo Linha por Linha
- Aplicando sscanf e fread
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();
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
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 :)");
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_.
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 );
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 );
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 );
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 );
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