Como inserir dados no MEIO de um arquivo txt

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Como inserir dados no MEIO de um arquivo txt

Mensagem por Mauricio em Ter 22 Dez 2009, 19:06

Olá.
Estou escrevendo um sistema custom de save game em vários slots, com criptografia, etc.
A idéia é jogar no txt os dados que quero (data, hora, vidas, pontos, fase atual) para o slot1, depois repetir embaixo para o slot2, assim por diante. Ex:

Inicio txt:

data save1
pontos save1
vidas save1
data save2
pontos save2
vidas save2
data save3
pontos save3
vidas save3

Fim Txt.

Tudo ok, porém quando quero salvar somente no slot2, por exemplo, quero substituir (escrever por cima) a linha 4,5 e 6 no txt, deixando o resto intacto. Tenho como fazer isso?

Nos testes que fiz, se abrir o arquivo para escrita, mandar pular linhas com file_text_writeln(arquivo) e depois escrever os dados que quero, o arquivo final fica em branco onde madei pular a linha, matando os dados que quero que fiquem lá.

Poderia abrir para leitura, salvar tudo em variáveis, depois ver um jeito de escrever de volta o que quero manter, trocar o que quero trocar etc... mas isso é muito trabalho, se puder só dizer, pula para linha 4 e então escreve o que quero, pronto, seria o ideal. Tem como?

Valeu.

Mauricio

Número de Mensagens : 114
Data de inscrição : 13/06/2008
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   :

http://mbg3dmind.wordpress.com/

Voltar ao Topo Ir em baixo

Re: Como inserir dados no MEIO de um arquivo txt

Mensagem por Convidad em Ter 22 Dez 2009, 23:05

Na verdade, quando você abre o arquivo com file_text_open_write() a função passa a escrever por completo e não dá suporte para leitura enquanto o arquivo não for "fechado" e reiniciar o processo com file_text_open_read().

Nesse caso, o comum é armazenar o conteúdo do arquivo em variáveis, por exemplo, você poderia criar um jogo de arrays com índice para cada linha do arquivo.

Depois disso, passaríamos a escrever o conteúdo das variáveis e susbstituiríamos as linhas em questão. Seria como um buffer de leitura para a escrita.

Só é importante frizar que, neste caso, o arquivo não deveria ultrapassar o limite de 31999 linhas pois estamos lidando com variáveis array, e obviamente, o Game Maker não suporta um índice maior que este.

---- Editado ----

Lembrei-me de uma dica legal. Você poderia usar arquivos Ini, cuja manipulação é mais fácil, e criptografá-lo depois. As funções de controle de Ini são bem diretas, e mais simples de serem usadas.

Boa sorte!

Convidad
Convidado


Voltar ao Topo Ir em baixo

Re: Como inserir dados no MEIO de um arquivo txt

Mensagem por Mauricio em Qua 23 Dez 2009, 01:37

Realmente o uso de ini é muito fácil !! O problema é que o arquivo deve estar na mesma pasta do jogo... e por organização coloco tudo dentro de uma pasta data (carrego assets por código), deixando só o exe fora.
Mas enfim, ficou tão prático de lidar que vou deixar o arquivo de save fora mesmo...

Valeu.

Mauricio

Número de Mensagens : 114
Data de inscrição : 13/06/2008
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   :

http://mbg3dmind.wordpress.com/

Voltar ao Topo Ir em baixo

Re: Como inserir dados no MEIO de um arquivo txt

Mensagem por Borgo em Qua 23 Dez 2009, 17:46

Você pode:

1 - Ainda deixar os arquivos INI dentro de uma pasta, basta movê-la para a pasta raíz quanto for usar e movê-la novamente para a pasta original após seu uso.

Ou, a melhor:
2 - Utilizar a dll INI_DLL (se precisar dela, me avisa que eu tenho a cópia) ela manipula INIs mesmo que estejam em outra pasta e o melhor, seu manipulador é muito mais rápido que o built-in do GM pois ele carrega o arquivo ini inteiro para memória antes de usá-lo.

Borgo

Número de Mensagens : 69
Idade : 29
Data de inscrição : 06/01/2009
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

http://www.neonerds.com.br

Voltar ao Topo Ir em baixo

Re: Como inserir dados no MEIO de um arquivo txt

Mensagem por Mauricio em Qua 23 Dez 2009, 18:14

Hmmm, interessante este INI_DLL, porém na página que fala dele (é esta versão final?): http://sites.google.com/site/andykbf/inidll

Diz que o arquivo tem que ter o path completo obrigatoriamente. Nesse caso não posso usar um path relativo ao dir do jogo? Se não der fica impossível usar, pois se passar o jogo para outra pessoa não funcionaria...

Mauricio

Número de Mensagens : 114
Data de inscrição : 13/06/2008
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   :

http://mbg3dmind.wordpress.com/

Voltar ao Topo Ir em baixo

Re: Como inserir dados no MEIO de um arquivo txt

Mensagem por Convidad em Qua 23 Dez 2009, 22:58

Mauricio, eu fiz-te um código que acredito que vá dar-te uma direção no que eu havia sugerido. Esse script modifica apenas uma linha em questão. Você indica qual a linha a ser modificada e seu conteúdo string.

Para usá-lo chame-o assim:
modifica_linha(nome_arquivo, linha, conteudo);

Onde nome_arquivo é uma string contendo o endereço onde o arquivo se encontra. Linha é o índice, não esquecendo que a primeira linha do arquivo tem o índice 0 (zero).

Código:
var Arquivo, Indice, Conteudo, Linhas;

Arquivo := file_text_open_read(argument0);
Indice := argument1;
Conteudo := argument2;
Linhas := 0;

while not (file_text_eof(Arquivo))
begin
    Buffer[Linhas] := file_text_read_string(Arquivo);
    file_text_readln(Arquivo);
    Linhas += 1;
end;

file_text_close(Arquivo);
Arquivo := file_text_open_write(argument0);
Buffer[Indice] := Conteudo;

for (n = 0; n < Linhas; n += 1)
begin
    file_text_write_string(Arquivo, Buffer[n]);
    file_text_writeln(Arquivo);
end;

file_text_close(Arquivo);

Note que o script funciona mas o principal é que você adapte-o para o seu jogo. Digo isso porque devemos observar que ele abre o arquivo e lê todo o conteúdo a cada modificação o que poderia deixar o seu uso muito lento se o fizéssemos dentro de um loop trabalhando em um arquivo demasiado grande.

Se o arquivo for pequeno, creio que não haja problemas.

Diz que o arquivo tem que ter o path completo obrigatoriamente. Nesse caso não posso usar um path relativo ao dir do jogo? Se não der fica impossível usar, pois se passar o jogo para outra pessoa não funcionaria...

Quando lidamos com endereços de ficheiros podemos usar um ponto seguido de barra para indicar o diretório atual do executável. Isso funciona muito bem, desde que o executável principal do seu jogo não seja chamado por outro programa. Assim:

Código:
'.\'
Código:
'.\pasta de sprites\'
Código:
'.\pasta de musicas\'

Boa sorte!

Convidad
Convidado


Voltar ao Topo Ir em baixo

Re: Como inserir dados no MEIO de um arquivo txt

Mensagem por Mauricio em Qui 24 Dez 2009, 01:16

Ok! Valeu a força.
Fiz com o ini do gm mesmo, ficou mais prático e rápido, mas vou dar uma olhada no INI_DLL depois.

Ah, trocando um pouco de assunto, vcs já testaram o GM 8 ? Minhas dúvidas é se aquele replace sprite irá solucionar de vez os problemas de ler asset do disco (mesmo assim tem que procurar uma solução de zip, algo que não deixe a arte exposta) além de aquele esquema de exportar resources permitir marcar só um obj. Acontece seguido de ter um jogo complexo com centenas de objetos e quero exportar só 1 ou 2 para outro projeto. Pelo que vi no GM 8 só permite exportar todos obj... e não só os que quero, o que ainda é um problema....

Bom Natal a todos!

Mauricio

Número de Mensagens : 114
Data de inscrição : 13/06/2008
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   :

http://mbg3dmind.wordpress.com/

Voltar ao Topo Ir em baixo

Re: Como inserir dados no MEIO de um arquivo txt

Mensagem por Conteúdo patrocinado Hoje à(s) 04:05


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum