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

时间:2012-10-23 03:35:50

标签: 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

1 个答案:

答案 0 :(得分: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

直接回答:

最好使用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