如何将文件读作[Int],而不是String?

时间:2015-02-18 17:57:02

标签: file haskell io int

我需要将文件读取为字节,而不是字符。 但是当我执行getLine或getContents时,我得到IO String,并且需要[Int],而不是String。 我该怎么办?

2 个答案:

答案 0 :(得分:8)

Data.ByteString内部代表严格的 Word8 数组。

你几乎就像你已经习惯的那样使用它。导入它合格,例如

import qualified Data.ByteString as B

然后做像

这样的事情
main = do
  str <- B.getLine
  let bytes = B.unpack str
  print bytes

我不确定你怎么相信你需要Int。你想要一个正确的字节表示,例如Word8

答案 1 :(得分:4)

您可能会要求某种形式的反序列化,这应该被视为一个单独的步骤。首先考虑您正在读取某种二进制文件(即它不是文本)。为此,我们可能需要bytestring并且可以执行:

import qualified Data.ByteString.Lazy as BL
...
    contents <- BL.readFile someFile

获取文件内容后,我们可以从任何形式(StringTextByteString等)转换它们。你说你想要[Int]但是这并不能告诉我们数据的形式 - 这些是32位整数的大端吗? 64位?有多少人,你知道吗?让我们假设32位大端整数...并且假设文件完全由这些值组成:

import qualified Data.ByteString.Lazy as BL
import Data.Binary.Get
import Control.Monad
import Foreign.Storable 
import Data.Word 

readAndDecode :: FilePath -> IO [Int]
readAndDecode someFile =
  do contents <- BL.readFile someFile
     let nrWord32 = fromIntegral (BL.length contents) `div` sizeOf (undefined :: Word32)
     return $ runGet (map fromIntegral `fmap` replicateM nrWord32 getWord32be) contents

也就是说,我们读取文件,计算文件中32位字的数量,解码并将每个Word32转换为Int