使用Haskell读写文件

1. 直接读写文本文件

Haskell的Prelude库提供了两个函数用来直接读写文本文件,分别是readFilewriteFile,其类型签名如下:

readFile :: FilePath -> IO String
writeFile :: FilePath -> String -> IO ()

注意,FilePath只是String的别名(String本山亦是[Char]的别名。)
这两个函数用起来比较简单,第一个参数是文件名;readFile直接返回一个IO String,即在触发IO过程中返回文件的内容;writeFile第二个参数是需要写入文件的内容字符串,返回一个IO (),即触发一个无返回值的IO过程。

2. 句柄方式

Haskell读写文件需要使用系统接口,因此放在了系统库System.IO中。使用文件的主要方式是句柄。句柄是一种操作系统资源的方式,类似于一种附带类型信息的系统ID号,记录了资源所在的内存或者设备地址,并且附带响应的操作API。在Haskell的System.IO库中,小写字母h开头的函数都与句柄操作有关系。由于操作句柄是程序外部的系统资源,因此必然都是IO函数。下面列举一个打开文件并且按照行读取内容的过程:

import System.IO
import System.Environment(getArgs)
import Control.Monad(mapM_)

hGetLines :: Handle -> IO [String]
hGetLines h = do fileOk <- hIsOpen h
                 fileEof <- hIsEOF h
                 if fileOk && not fileEof
                 then do current <- hGetLine h
                         others  <- hGetLines h
                         return $ current:others
                 else return []

main = do args <- getArgs
          if length args /= 1
          then fail "no input file"
          else return ()
          h <- openFile (args !! 0) ReadMode
          content <- hGetLines h
          mapM_ putStrLn content
          hClose h
  • IOMode,包括几个参数:ReadMode | WriteMode | AppendMode | ReadWriteMode分别对应:只读、只写、追加和读写模式。
  • 如果用户需要处理大型文本,则应当配合ByteString(Data.ByteString)库和Text(Data.Text)库。
  • 如果用户需要处理二进制,将openFile换成openBinaryFile

你可能感兴趣的:(使用Haskell读写文件)