我在理解一段代码时遇到了一些麻烦。
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
将使用相同的输入句柄再次调用,因此它将读取相同的内容每次都行,从不进步。
我在这里缺少什么?
答案 0 :(得分:4)
openFile
返回的handle与指向文件中当前位置的指针相关联。来自文档:
大多数句柄也会有一个当前的I / O位置,指示下一个输入或输出操作的位置。
每当您通过hGetLine
从该句柄读取一行时,此指针将前进到下一行。 IIRC与C文件句柄的行为相同。