SSGamers - 13 Anos online por você.

#SSGamers - A Comunidade que mais crescer no brasil!

Participe do fórum, é rápido e fácil

SSGamers - 13 Anos online por você.

#SSGamers - A Comunidade que mais crescer no brasil!

SSGamers - 13 Anos online por você.

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
Chegou o novo tema 6.5.5 - SSGamers - Servidores online de qualidade - Aproveite e entre para nossa comunidade, inscreva-se já! - Ouça nossa web radio - Veja nossas novidades - Participe dos nossos setores de jogos online - Parcerias aberta fale já com um administrador.

    [Tutorial] Salvamento de Dados (Sem includes)

    Weslley_Script
    Weslley_Script
    SS - Fundador
    SS - Fundador


    Steam Steam : WeslleySSGames
    Zello : WeslleySSGames
    Mensagens : 11638
    Moedas : 1032933
    Data de inscrição : 06/10/2011
    Idade : 29
    Localização : Brasil

    [Tutorial] Salvamento de Dados (Sem includes) Empty [Tutorial] Salvamento de Dados (Sem includes)

    Mensagem por Weslley_Script Sáb 13 maio 2023 - 7:44

    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 [Tutorial] Salvamento de Dados (Sem includes) Mrgreen

    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 ? [Tutorial] Salvamento de Dados (Sem includes) Wink). Caso queria fazer o teste, declare essa nativa no seu GameMode:
    pawn Код:

    Código:
    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 [Tutorial] Salvamento de Dados (Sem includes) Mrgreen


    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 [Tutorial] Salvamento de Dados (Sem includes) Smile

    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 Код:

    Código:
    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

    Código:
    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:

    Código:
    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:


    Código:
    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 [Tutorial] Salvamento de Dados (Sem includes) Smile. 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 [Tutorial] Salvamento de Dados (Sem includes) Wink
    pawn Код:

    Código:
    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 Код:

    Código:
    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
    }




    Código:
    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 Код:

    Código:
    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 Код:

    Código:
    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 Код:

    Código:
    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


    Creditos: Juniiro3



    [Tutorial] Salvamento de Dados (Sem includes) D07Xwqb
    [Tutorial] Salvamento de Dados (Sem includes) Yjab9HN

      Data/hora atual: Sáb 23 Nov 2024 - 11:13