如何将文件读取为 [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
获取文件内容后,我们可以将它们转换为任何形式(String
、Text
、ByteString
等)。你说你想要 [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
我需要以字节而不是字符的形式读取文件。 但是当我执行 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
获取文件内容后,我们可以将它们转换为任何形式(String
、Text
、ByteString
等)。你说你想要 [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