使用Data.Binary.decodeFile,遇到错误“demandInput:not enough bytes”

时间:2013-08-29 22:59:59

标签: haskell io binary-data bytestring

我正在尝试使用Data.Binary中的encodeFile和decodeFile函数来保存非常大的数据结构,这样我就不必在每次运行此程序时重新计算它。相关的编码和解码功能如下:

writePlan :: IO ()
writePlan = do (d, _, bs) <- return subjectDomain
               outHandle <- openFile "outputfile" WriteMode
               ((ebsP, aP), cacheData) <- preplanDomain d bs
               putStrLn "Calculated."

               let toWrite = ((map pseudofyOverEBS ebsP, aP),
                              pseudofyOverMap cacheData) :: WrittenData
                 in do encodeFile preplanFilename $ encode toWrite
                    putStrLn "Done."


readPlan :: IO (([EvaluatedBeliefState], [Action]), MVar HeuCache)
readPlan = do (d, _, _) <- return subjectDomain
              inHandle <- openFile "outputfile" ReadMode

              ((ebsP, aP), cacheData) <-  decodeFile preplanFilename :: IO WrittenData

              fancyCache <- newMVar (M.empty, depseudofyOverMap cacheData)
              return $! ((map depseudofyOverEBS ebsP, aP), fancyCache)

计算和写入文件的程序(使用writePlan)执行时没有错误,输出一个巨大的二进制文件。但是,当我运行接收此文件的程序时,执行readPlan会导致错误(程序名称为“Realtime”):

Realtime: demandInput: not enough bytes

我无法做出这方面的头脑和尾巴,并且谷歌搜索没有发现任何实质性的文档或讨论此消息。任何见解都将不胜感激!

1 个答案:

答案 0 :(得分:3)

我参加派对的时间很晚,但在寻找类似问题的帮助时发现了这一点。我正在使用Data.Binary.Get的增量接口。正如您在here中看到的那样,该函数在Data.Binary.Get.Internal中定义。现在我猜,但你的decodeFile函数可能会进行某种解析并抛出错误,因为文件没有完全解析(即解析器认为文件中必须有其他东西,但它已经到达EOF)。

希望能帮助任何有这个/类似问题的人!