Difference between revisions of "FP Laboratory 12/cs"

From Marek Běhálek Wiki
Jump to navigation Jump to search
(Created page with "Získaný <code>Handle</code> může být použit pro práci se souborem. Funkce, která přečte obsah souboru:")
(Created page with "Alternativně můžete použít:")
 
(One intermediate revision by the same user not shown)
Line 6: Line 6:
 
Získaný <code>Handle</code> může být použit pro práci se souborem. Funkce, která přečte obsah souboru: [https://hackage.haskell.org/package/base-4.16.0.0/docs/System-IO.html#v:hGetContents <code>hGetContents :: Handle -> IO String</code>]
 
Získaný <code>Handle</code> může být použit pro práci se souborem. Funkce, která přečte obsah souboru: [https://hackage.haskell.org/package/base-4.16.0.0/docs/System-IO.html#v:hGetContents <code>hGetContents :: Handle -> IO String</code>]
  
At the end, you should close the opened file handle: [https://hackage.haskell.org/package/base-4.16.0.0/docs/System-IO.html#v:hClose <code>hClose :: Handle -> IO ()</code>]
+
Na konci práce se souborem, by měl být soubor uzavřen: [https://hackage.haskell.org/package/base-4.16.0.0/docs/System-IO.html#v:hClose <code>hClose :: Handle -> IO ()</code>]
  
Alternatively you can use : [https://hackage.haskell.org/package/base-4.16.0.0/docs/Prelude.html#v:readFile <code>readFile :: FilePath -> IO String</code>]
+
Alternativně můžete použít: [https://hackage.haskell.org/package/base-4.16.0.0/docs/Prelude.html#v:readFile <code>readFile :: FilePath -> IO String</code>]
 
</div>
 
</div>
  

Latest revision as of 12:53, 6 December 2021

Práce se soubody - monáda IO

  • Implementujte program, který načte soubor a počet jeho řádku a následně jej vypíše na obrazovku.

Při řešení se podívejte na: openFile :: FilePath -> IOMode -> IO Handle

Získaný Handle může být použit pro práci se souborem. Funkce, která přečte obsah souboru: hGetContents :: Handle -> IO String

Na konci práce se souborem, by měl být soubor uzavřen: hClose :: Handle -> IO ()

Alternativně můžete použít: readFile :: FilePath -> IO String

import System.IO
import Control.Exception

main = do fromHandle <- opf "Read from: " ReadMode
          contents <- hGetContents fromHandle
          putStr (numberLines contents)
          hClose fromHandle

opf :: String -> IOMode -> IO Handle
opf prompt mode = do putStr prompt
                     name <- getLine  
                     catch (openFile name mode )
                           (\e -> do putStr ("Can't open "++name++":"++show (e :: IOException) ++"\n")
                                     opf prompt mode)

numberLines::String -> String
numberLines text = let l = lines text
                       numbered = zip [1..] l
                       result = [show x ++".\t"++content++"\n" | (x, content)<-numbered]
                   in concat result