从二进制文件中读取整数序列

时间:2011-06-09 12:09:10

标签: haskell file-io

我有一个包含32位整数序列的二进制文件。我如何将它们读入列表(或Data.Array,我可能最终会使用它)?

我在文档中找到的就是这个hGetBuf函数,目前还不清楚如何使用它(需要Ptr到缓冲区?)。 http://www.haskell.org/ghc/docs/latest/html/libraries/base-4.3.1.0/System-IO.html#v:hGetBuf

当然必须有一个简单的方法,但我找不到它!

2 个答案:

答案 0 :(得分:4)

您可以使用binary包轻松完成此操作。您可以找到文件阅读文档here

它已经包含了一种反序列化32位整数列表的方法,因此您只需要调用decodeFile函数。为清晰起见,您可能希望有一个类型版本:

decodeIntsFile :: FilePath -> IO [Int32]
decodeIntsFile = decodeFile

然后,如果您希望将整数列表作为数组,请使用适当的数组转换,例如listArray

答案 1 :(得分:4)

如果文件只是32位整数,则注意@ TomMD的警告。这样的事情应该可以胜任。

import Control.Applicative
import Control.Monad
import Data.Binary
import Data.Binary.Get
import Data.Binary.Put
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString as BS
import Data.Int
import System.Posix

testPut = BL.writeFile "foo.bin" . runPut . mapM_ put $ nums
  where nums :: [Int32]
        nums = [5,6,7,8]

testGet :: IO [Int32]
testGet = do n <- fromInteger . toInteger . fileSize <$> getFileStatus "foo.bin"
             let readInts = runGet (replicateM (n `div` 4) get)
             readInts . BL.fromChunks . (:[]) <$> BS.readFile "foo.bin"