最近は、久しぶりにHaskellの本を読んでいる。 以前学んだことはだいぶ忘れている。
半分まで読んだあたりで、複数ファイルをConcatして表示するというコードがあったので、試したら出力はstdoutのみだった。試しに、ファイルにも出力できないかと思い、書き換えてみたが、うまくいかない。ChatGPTの助けを借りて、なんとかできた。
module Main where
import Control.Exception (bracket, finally)
import Control.Monad (forM_)
import System.IO
( hFlush,stdout,Handle,FilePath,IOMode(..)
,openFile,hClose,hIsEOF,hGetLine,hPutStrLn
)
import System.Environment (getArgs)
import Data.Char (toUpper)
main :: IO()
main = do
filePaths <- getArgs
hdl2 <- openFile "output.txt" WriteMode
concatMultiFiles filePaths hdl2
concatMultiFiles :: [FilePath] -> Handle -> IO()
concatMultiFiles filePaths dst =
forM_ filePaths $ \filePath ->
bracket
(openFile filePath ReadMode)
hClose
(\hdl -> copyFile hdl dst)
copyFile :: Handle -> Handle -> IO()
copyFile src dst = loop
where
loop = do
isEof <- hIsEOF src
if isEof
then return ()
else do
line <- hGetLine src
hPutStrLn dst line
hPutStrLn stdout line
hFlush dst
loop
ポイントは、最後から2行目のhFlush dstを追加したことだった。
0 件のコメント:
コメントを投稿