我有一个包含32位整数序列的二进制文件。我如何将它们读入列表(或Data.Array,我可能最终会使用它)?
我在文档中找到的就是这个hGetBuf函数,目前还不清楚如何使用它(需要Ptr到缓冲区?)。 http://www.haskell.org/ghc/docs/latest/html/libraries/base-4.3.1.0/System-IO.html#v:hGetBuf
当然必须有一个简单的方法,但我找不到它!
答案 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"