Чтение последовательности целых из двоичного файла - PullRequest
6 голосов
/ 09 июня 2011

У меня есть двоичный файл, содержащий последовательность 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 ]

4 голосов
/ 10 июня 2011

Если файл просто 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"
4 голосов
/ 09 июня 2011

Вы можете сделать это довольно легко с пакетом binary. Вы можете найти документацию для чтения файла здесь .

Он уже включает способ десериализации списка 32-битных целых чисел, поэтому вам просто нужно вызвать функцию decodeFile. Вы можете хотеть иметь напечатанную версию этого для ясности:

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

Тогда, если вы хотите, чтобы ваш список целых чисел был массивом, используйте соответствующее преобразование массива, например listArray.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...