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

コードの問題点:

あなたのコードには多くの問題があります。

  • なぜあなたは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
于 2012-10-23T04:13:22.053 に答える