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

t0xe

readFile alternativo

Recommended Posts

t0xe

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)


^_^

Share this post


Link to post
Share on other sites
Betovsky

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


"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Share this post


Link to post
Share on other sites
t0xe

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!!


^_^

Share this post


Link to post
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

×

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.