ファイルの覚書です。
Prelude> :t readFile
readFile :: FilePath -> IO String
引数の型の FilePath
は、String
の別名(型シノニム)で、ファイルパスを表しています。readFile
は引数のファイルパスから文字列を読み込みます。
以下のようなファイルがあるとします。
hoge hoge hoge hoge
hoge hoge hoge hoge
hoge hoge hoge hoge
次のコードで hoge.txt
を表示できます。
a = do
text <- readFile "hoge.txt"
putStrLn text
*Main> a
hoge hoge hoge hoge
hoge hoge hoge hoge
hoge hoge hoge hoge
ファイルパスにファイルが存在しない場合は次のような例外が発生します。
*** Exception: hoge.txt: openFile: does not exist (No such file or directory)
*Main> :t writeFile
writeFile :: FilePath -> String -> IO ()
writeFile
は、引数として受け取ったファイルパスのファイルに、引数として受け取った文字列を書き込みます。
a = do
text <- readFile "hoge.txt"
putStrLn text
b = do
let text = "Haskell Haskell Haskell\n" ++
"Haskell Haskell Haskell\n" ++
"Haskell Haskell Haskell"
writeFile "hoge.txt" text
*Main> b
*Main> a
Haskell Haskell Haskell
Haskell Haskell Haskell
Haskell Haskell Haskell
*Main>
ファイルパスにファイルが存在しない場合は、新しくファイルを作ります。ファイルが存在する場合は、そのファイルを上書きします。
*Main> :t appendFile
appendFile :: FilePath -> String -> IO ()
appendFile
は、ファイルパスに文字列を追加します。
a = do
text <- readFile "hoge.txt"
putStrLn text
b = do
let text = "Haskell Haskell Haskell\n" ++
"Haskell Haskell Haskell\n" ++
"Haskell Haskell Haskell"
writeFile "hoge.txt" text
c = do
let text = "\nGtk2Hs wxHaskell HTK"
appendFile "hoge.txt" text
*Main> b
*Main> c
*Main> a
Haskell Haskell Haskell
Haskell Haskell Haskell
Haskell Haskell Haskell
Gtk2Hs wxHaskell HTK
*Main>
ファイルパスにファイルが存在しない場合は、新しくファイルを作り文字列を書き込みます。ファイルが存在する場合は、そのファイルの末尾に文字列を追加します。
System.IO
モジュールを読み込むと、より高度な操作ができるようになります。
*Main> import System.IO
*Main System.IO> :t openFile
openFile :: FilePath -> IOMode -> IO Handle
openFile
は、引数としてファイルパスとIOMode
を受け取り、戻り値としてIO Handle
を返します。読み書きは、そのIO Handle
を操作して行います。
IOMode
には次の4種類があります。
ReadMode
読み込みモードWriteMode
書き込みモードAppendMode
追加モードReadWriteMode
読み書きモード
ReadMode
とReadWriteMode
は、ファイルが存在しない場合は、次の例外を返します。
*** Exception: hoge.txt: openFile: does not exist (No such file or directory)
WriteMode
とAppendMode
は、ファイルが存在しない場合は、指定のファイルを新しく作ります。
Main> import System.IO
*Main System.IO> :t hClose
hClose :: Handle -> IO ()
hClose
は、引数として、IO Handle
を受け取り、そのファイルを閉じます。
Main> import System.IO
*Main> :t hGetContents
hGetContents :: Handle -> IO String
hGetContents
は、引数のHandle
から文字列を取得します。
Main> import System.IO
*Main> :t hGetChar
hGetChar :: Handle -> IO Char
hGetChar
は、引数のHandle
から文字を取得します。
Main> import System.IO
*Main> :t hPutStr
hPutStr :: Handle -> String -> IO ()
hPutStr
は、ハンドルと文字列を引数に取り、ハンドルが指し示すファイルに文字列を書き込みます。
Main> import System.IO
*Main> :t hPrint
hPrint :: Show a => Handle -> a -> IO ()
hPrint
は、ハンドルと文字列を引数に取り、ハンドルが指し示すファイルに文字列を書き込みます。
(hPrint
で書き込んだ文字列には二重引用符 " がつきます)
import System.IO
readmode = do
handle <- openFile "hoge.txt" ReadMode
text <- hGetContents handle
putStrLn text
hClose handle
appendmode = do
handle <- openFile "hoge.txt" AppendMode
let text = "\nhoge hoge hoge hoge"
hPutStr handle text
hClose handle
*Main> readmode
Haskell Haskell Haskell
Haskell Haskell Haskell
Haskell Haskell Haskell
Gtk2Hs wxHaskell HTK
*Main> appendmode
*Main> readmode
Haskell Haskell Haskell
Haskell Haskell Haskell
Haskell Haskell Haskell
Gtk2Hs wxHaskell HTK
hoge hoge hoge hoge
*Main> appendmode
*Main> readmode
Haskell Haskell Haskell
Haskell Haskell Haskell
Haskell Haskell Haskell
Gtk2Hs wxHaskell HTK
hoge hoge hoge hoge
hoge hoge hoge hoge
*Main>