1. 直接读写文本文件
Haskell的Prelude库提供了两个函数用来直接读写文本文件,分别是readFile
和writeFile
,其类型签名如下:
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
。
网友评论