如何将文件读取为 [Int],而不是字符串?

How to read file as [Int], not as String?

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

Data.ByteString 有一个严格的 Word8 数组的内部表示。

您使用它的方式和您已经习惯的差不多。合格导入,例如

import qualified Data.ByteString as B

然后做类似

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

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

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

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

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

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