Skip to main content

  | मौसम…

411 समाचार
Public archive edition · Attributed source reporting with original dates · AI drafts are excluded

411 REFERENCE · Wikibooks

Haskell/Libraries/Solutions/IO

Reference material by Wikibooks contributors. This retains its source identity and is not 411 news reporting.

Write a variation of our program so that it first asks whether the user wants to read from a file, write to a file, or quit. If the user responds with "quit", the program should exit. If they respond with "read", the program should ask them for a file name and then print that file to the screen (if the file doesn't exist, the program may crash). If they respond with "write", it should ask them for a file name and then ask them for text to write to the file, with "." signaling completion. All but the "." should be written to the file. For example, running this program might produce: Do you want to [read] a file, [write] a file, or [quit]? read Enter a file name to read: foo ...contents of foo... Do you want to [read] a file, [write] a file, or [quit]? write Enter a file name to write: foo Enter text (dot on a line by itself to end): this is some text for foo . Do you want to [read] a file, [write] a file, or [quit]? read Enter a file name to read: foo this is some text for foo Do you want to [read] a file, [write] a file, or [quit]? blech I don't understand the command blech. Do you want to [read] a file, [write] a file, or [quit]? quit Goodbye! module Main where import System.IO import Control.Exception main = doLoop doLoop = do putStrLn "Do you want to [read] a file, [write] a file, or [quit]?" command <- getLine if command == "quit" then return() else if command == "read" || command == "write" then do putStrLn ("Enter a file name to " ++ command) filename <- getLine if command == "read" then do doRead filename doLoop else do doWrite filename doLoop else doLoop doRead filename = do bracket (openFile filename ReadMode) hClose (\h -> do contents <- hGetContents h putStrLn contents) doWriteChars handle = do char <- getChar if not (char == '.') then do hPutChar handle char doWriteChars handle else return () doWrite filename = do bracket (openFile filename WriteMode) hClose (\h -> doWriteChars h)