0

假设用户输入= 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
4

1 回答 1

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
于 2012-10-23T04:13:22.053 回答