用户输入内容时的Haskell ..总结txt文件中的数字

use*_*145 0 haskell haskell-platform

假设用户输入= 6000并且input.txt内的数字是= 5000.总和将是11000.屏幕上显示的数字和存储在文件中的值将被覆盖为11000.请帮助我,谢谢

import System.IO

menu :: IO ()
menu = do

handle <- openFile "input.txt" ReadMode  
          contents <- hGetContents handle 
      putStr contents
      hClose handle
      contents <- readFile "input.txt"
      print . sum . read $ contents
      putStr("\nThe amount of money that you want to deposit : ")
      y<-getLine
Run Code Online (Sandbox Code Playgroud)

Sat*_*vik 5

你的代码有什么问题:

你的代码有很多问题.

  • 你为什么读两次.
  • 为什么最后会有一个getLine.
  • 您使用的大多数功能的类型不匹配.
  • 输入文件是仅包含一行还是多行.

最好查看您正在使用的函数类型,然后组合它们.

从我可以推断出你想要的东西中可能修正你的代码

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
Run Code Online (Sandbox Code Playgroud)

直接回答:

最好使用withFile你想要阅读然后写.readFile懒惰地读取文件,因此无法保证何时关闭文件句柄.在上述情况下,如果writeFile在打印输出之前写入行,则可能会出现运行时错误,抱怨打开句柄.所以withFile是一个更安全的选项,你将只打开一次文件,相比之下,在上述情况下只打开两次.

我认为你只想在输入文件的第一行添加数字和你输入的数字.

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
Run Code Online (Sandbox Code Playgroud)