以下代码如何通过文本文件?

时间:2014-11-24 12:27:44

标签: haskell file-io

我在理解一段代码时遇到了一些麻烦。

In Real World Haskell Chapter 7在“使用文件和句柄”部分中,作者使用以下代码迭代文本文件,并以大写形式将每一行写入新文本文件:(完整此代码的作者信用)

-- file: ch07/toupper-imp.hs
import System.IO
import Data.Char(toUpper)

main :: IO ()
main = do 
       inh <- openFile "input.txt" ReadMode
       outh <- openFile "output.txt" WriteMode
       mainloop inh outh
       hClose inh
       hClose outh

mainloop :: Handle -> Handle -> IO ()
mainloop inh outh = 
    do ineof <- hIsEOF inh
       if ineof
           then return ()
           else do inpStr <- hGetLine inh
                   hPutStrLn outh (map toUpper inpStr)
                   mainloop inh outh

我不明白的部分是:Haskell如何知道要写入另一个文件的哪一行?

从我从代码中收集的内容中,输入文件中的位置永远不会改变,因此通过我受c影响的逻辑,mainloop将使用相同的输入句柄再次调用,因此它将读取相同的内容每次都行,从不进步。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:4)

openFile返回的handle与指向文件中当前位置的指针相关联。来自文档:

  

大多数句柄也会有一个当前的I / O位置,指示下一个输入或输出操作的位置。

每当您通过hGetLine从该句柄读取一行时,此指针将前进到下一行。 IIRC与C文件句柄的行为相同。