如何在Haskell中清除EOF标志?

31moq8wy  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(119)

我有一段很小的原始代码来阅读一个文件--尽管文件的内容是从另一个应用程序附加的--它是Linux实用程序less。它工作正常,但如果读者达到EOF,“EOF”标志的文件设置。然后对文件的任何其他读取操作都会导致空读取/文件大小不变(hFileSizehTell)。解决方案是调用clearerrrewind--我想它们会清除EOF标志。如何在Haskell中实现?如果有某种方法,是否可以以跨平台的方式实现(如果不是跨平台的话)?
PS.目前我重新打开文件,但我认为,永久重新开放期间投票,与1-2秒的时间也许不是那么好的主意,如果有更好的解决方案.

58wvjzkj

58wvjzkj1#

在Haskell中,您可以使用System.IO模块来处理文件和管理文件句柄。要清除EOF标志并重置文件指针,可以使用hSeek函数。此函数允许您将文件句柄的位置设置为给定的偏移量。
以下是如何在Haskell中清除EOF标志并重置文件指针:

import System.IO

resetFileHandle :: Handle -> IO ()
resetFileHandle h = hSeek h AbsoluteSeek 0

main :: IO ()
main = do
    h <- openFile "example.txt" ReadMode
    content <- hGetContents h
    putStrLn content
    -- At this point, the file pointer is at the end of the file and the EOF flag is set.
    
    -- Clear the EOF flag and reset the file pointer
    resetFileHandle h

    -- Now you can read the file again, and the content will not be empty.
    content2 <- hGetContents h
    putStrLn content2

    hClose h

字符串
在上面的代码中,我们定义了resetFileHandle函数,它接受一个文件句柄(Handle)作为参数。hSeek函数用于将文件句柄的位置设置为文件的开头(AbsoluteSeek 0),从而有效地清除EOF标志。
但是,请注意,此解决方案假设在您阅读文件时,该文件没有被其他进程修改。如果文件不断地被另一个应用程序追加,并且您希望在新内容到达时读取新内容,则在每次轮询时重新打开文件可能是一种更好的方法。
如果你想要一个跨平台的解决方案,使用hSeek通常可以跨不同的平台移植。但是,请注意,文件处理和行为可能会因操作系统而异,因此在目标平台上彻底测试代码总是一个好主意。

相关问题