Haskell   ファイル

ホーム   目次


ファイルの覚書です。

ファイルの読み書き

readFile

Prelude> :t readFile
readFile :: FilePath -> IO String

引数の型の FilePath は、String の別名(型シノニム)で、ファイルパスを表しています。readFile は引数のファイルパスから文字列を読み込みます。

以下のようなファイルがあるとします。

hoge.txt


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)

writeFile

*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>

ファイルパスにファイルが存在しない場合は、新しくファイルを作ります。ファイルが存在する場合は、そのファイルを上書きします。

appendFile

*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

System.IO モジュールを読み込むと、より高度な操作ができるようになります。

openFile

*Main> import System.IO
*Main System.IO> :t openFile
openFile :: FilePath -> IOMode -> IO Handle

openFile は、引数としてファイルパスとIOModeを受け取り、戻り値としてIO Handleを返します。読み書きは、そのIO Handleを操作して行います。

IOMode

IOModeには次の4種類があります。

ReadModeReadWriteModeは、ファイルが存在しない場合は、次の例外を返します。

*** Exception: hoge.txt: openFile: does not exist (No such file or directory)

WriteModeAppendModeは、ファイルが存在しない場合は、指定のファイルを新しく作ります。

hClose

Main> import System.IO
*Main System.IO> :t hClose
hClose :: Handle -> IO ()

hCloseは、引数として、IO Handleを受け取り、そのファイルを閉じます。

hGetContents

Main> import System.IO
*Main> :t hGetContents
hGetContents :: Handle -> IO String

hGetContentsは、引数のHandleから文字列を取得します。

hGetChar

Main> import System.IO
*Main> :t hGetChar
hGetChar :: Handle -> IO Char

hGetCharは、引数のHandleから文字を取得します。

hPutStr

Main> import System.IO
*Main> :t hPutStr
hPutStr :: Handle -> String -> IO ()

hPutStrは、ハンドルと文字列を引数に取り、ハンドルが指し示すファイルに文字列を書き込みます。

hPrint

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>


11592 visits
Posted: Jan. 22, 2019
Update: Jan. 22, 2019

ホーム   目次   ページトップ