Jump to content

Escrever num sitio especifico de um ficheiro


joaomfs
 Share

Recommended Posts

tenho que fazer uma funcao de le um xml com a descricao de um jogo e essa funcao tem de prodizir uma nova peca a ser jogada, nao sei como vou escrever a nova peca no xml

a parte onde devo escrever e aqui <next tile="B"/>, e caso nao seja possivel gerar mais nenhuma peca fica a tag next vazia <next/>

(mudar o B)

e o resto do xml devera ficar igual

peco desculpa mas estou a escrever com o teclado em ingles e nao sei onde estao certos caracteres

obrigado

Link to comment
Share on other sites

joaomfs,

O mais apropriado seria provavelmente utilizares alguma biblioteca para leitura e manipulação de XML. Para já a tua tarefa é relativamente simples e facilmente exequível com simples leitura de texto e modificação de uma linha, mas no futuro poderás ter necessidades bem mais complexas.

Se não utilizares uma biblioteca para XML, então ficas a saber que habitualmente opta-se sempre por escrever um novo ficheiro por completo. Fazem-se as alterações em memória (se possível) e no final escreve-se o resultado de uma vez para o disco. Vou exemplificar-te o problema de alterar directamente:

Imagina o seguinte ficheiro:

<?xml version="1.0" encoding="UTF-8"?>
<root>
 <next tile="B">
</root>

E agora imagina que queres alterar para a tag vazia <next />:

<?xml version="1.0" encoding="UTF-8"?>
<root>
 <next />
</root>

Na realidade, os ficheiros são vistos pelo computador da seguinte forma:

<?xml version="1.0" encoding="UTF-8"?>\n<root>\n  <next tile="B">\n</root>\n
<?xml version="1.0" encoding="UTF-8"?>\n<root>\n  <next />\n</root>\n

Como podes ver, a noção de "nova linha" é representada pelo caracter \n. Se uma determinada linha for encurtada, todas as seguintes terão que ser "arrastadas" para a esquerda, mais perto do início do ficheiro. Podíamos também substituir <next tile="B"> por <next /> de forma a ocupar o espaço original... mas ainda assim isso implicaria aceder ao ficheiro como se fosse um ficheiro binário (que poderíamos manipular byte a byte) e não um ficheiro de texto.

Link to comment
Share on other sites

Obrigado @pwseo mandei um mail ao cordenador do projeto e ele disse que não era presiso criar um novo ficheiro com o xml mas sim pegar no conteudo do xml antigo e alterar o <next tile=B/> para o tail que geramos e depois imprimir o conteudo modificado na consola, sei que tenho de ler o xml depois procurar pelo Element <next tile=B/> no lugar do B poderá ter um B, N,C ou E e substituir tudo pelo novo que gerou, isso é que não sei como fazer será que podes dar uma ajuda?

o codigo que tenho para passar um xml para element é o seguinte :

-- | Read a XML file to a 'String'.
readXML :: String -> IO String
readXML file = do
               c <- readFile file
               return c

-- | Parse a XML String to an 'Element'.
myParseXML :: String -> Element
myParseXML s = let Just el = parseXMLDoc s
              in el

Peço desculpa por tar a chatear mas sou um pouco noob 😉

Edited by thoga31
Tags code + GeSHi + formatação
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.