コードの問題点:
あなたのコードには多くの問題があります。
- なぜあなたは2回読んでいますか?
- 最後に getLine がある理由。
- 使用したほとんどの関数の型が一致しません。
- 入力ファイルに 1 行しか含まれていないか、複数の行が含まれていますか。
使用している関数の種類を確認してから構成することをお勧めします。
あなたが望むと私が推測できるものからのあなたのコードのおそらく修正は
import System.IO
main :: IO ()
main = do
y<-getLine
content <- readFile "input.txt"
let out = sum $ map read $ y:(words content)
putStrLn $ "\nThe amount of money that you want to deposit : " ++ show out
writeFile "input.txt" $ show out
直接の答え:
withFile
読んでから書きたい、という使い方がベターです。readFile
ファイルを遅延して読み取るため、ファイルハンドルがいつ閉じられるかは保証されません。上記の場合writeFile
、出力を印刷する前に行を記述すると、開いているハンドルについて不平を言う実行時エラーが発生する可能性があります。これwithFile
はより安全なオプションであり、上記の場合は 2 回ではなく、ファイルを開くのは 1 回だけです。
入力ファイルの最初の行の数字を入力した数字に追加したいだけだと思いました。
import System.IO
main = do
input <- getLine
out <- sumFile (read input) "input.txt"
putStr $ "\nThe amount of money that you want to deposit : " ++ show out
sumFile :: Int -> FilePath -> IO Int
sumFile input fp = withFile fp ReadWriteMode add
where
add handle = do
number <- hGetLine handle
hSeek handle AbsoluteSeek 0
let sum = input + read number
hPutStrLn handle (show sum)
return sum