• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

t0xe

readFile alternativo

3 mensagens neste tópico

boa tarde gente!

volto com mais uma duvidinha:

tenho dois pedaços de código, ambos retornam IO String, mas apenas um deles realmente funciona.. ja verifiquei a identação e acho muito estranho um funcionar e outro não, e tenho quase a certeza que este é um daqueles casos do género "falta um ;" lol

Vejam por favor e digam-me de vossa justiça:

Este funciona:

readFile' :: FilePath->IO String
readFile' path = bracket
                 (openFile path ReadMode) 
                 hClose
                 (\h -> do x <- hGetContents h
                           putStrLn (x)
                           return x)

E este não:

readFile' :: FilePath->IO String
readFile' path = bracket
                 (openFile path ReadMode) 
                 hClose
                 (\h -> do x <- hGetContents h
                           return x)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque é que esse não funciona, que erro é que dá?

Há primeira vista parece tudo bem.

Já agora podes melhorar o código

Em vez de teres com função lambda

readFile' :: FilePath->IO String
readFile' path = bracket
                 (openFile path ReadMode)
                 hClose
                 (\h -> do x <- hGetContents h
                           return x)

Podes simplesmente

readFile' :: FilePath->IO String
readFile' path = bracket
                 (openFile path ReadMode)
                 hClose
                 hGetContents

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, o problema é que não dá erro nenhum..

No primeiro caso,  a função imprime tudo o que leu para o écran e depois devolve uma string com todo o conteúdo do ficheiro. No segundo caso simplesmente me devolve uma string vazia ("").

Não sei como contrariar isto.. Queria fazer uma função que lesse os conteúdos de um ficheiro, os actualizasse e depois os escrevesse. Tentei usar o readFile e writeFile normais e o read corre bem, mas o write não funciona, dá-me um erro que diz que não tenho permissão para escrever no ficheiro. Como as duas funcionam bem quando são invocadas "sozinhas" pensei que o erro estivesse em chamar uma a seguir à outra, e decidi escrever as duas utilizando handles para ter a certeza que estes eram fechados..

Segui o teu conselho e tentei mas devolveu-me igualmente uma string vazia..

Vou tentar implementar uma função que faça as coisas imediatamente utilizando um só handle (ReadWriteMode) para ver se finalmente funciona. Depois posto como correu!

Obrigado Betovsky!!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora