用输入文件编译Haskell,错误openFile:不存在(没有这样的文件或目录)

时间:2014-02-13 21:12:00

标签: haskell

如果这是一个简单的问题,我道歉。 我已经指定了一个输入文件,该文件位于代码源文件的同一目录中。

isprime :: Int -> [Int] -> Bool 
isprime ...

main = do
  handle <- openFile "primes-to-100k.txt" ReadMode
  contents <- hGetContents handle
  i <- getLine
  print $ isprime (read i::Int) $ map (\x->read x::Int) $ lines contents
  hClose handle

当我在shell中使用“runhaskell Q111.hs”时代码运行良好, 但当我用“ghc --make Q111.hs编译并运行时,我收到了一条错误消息

Q111:primes-to-100k.txt:openFile:不存在(没有这样的文件或目录) 注销

重点是代码与ghci和runhaskell运行良好,但是可执行文件找不到输入txt。

我是否必须使用某种方式向编译器提供输入txt?

2 个答案:

答案 0 :(得分:3)

尝试curdDir <- getCurrentDirectorypaths <- getDirectoryContents并检查路径。如果它包含文件名,则路径是正确的(并尝试使用contents <-readFile "file"用于更简单的程序,但这不是必需的。)

编辑: ...并使用isexist <- doesFileExist "f"来检查是否存在。

答案 1 :(得分:3)

你是如何运行可执行文件的?文本文件必须位于运行程序的目录中,该程序可能是也可能不是程序的位置。如果从命令行运行./Q111,或者双击Windows中的Q111.exe,则文本文件必须与可执行文件位于同一文件夹中。如果您位于命令行的不同目录中,则文本文件必须位于当前目录所在的位置,而不是可执行文件所在的目录。

编辑:只是从你的其他评论中看到你在OS X上,并且(我假设)正在双击该程序。从你的说法我猜,OS X将这样执行的程序的当前目录设置为你的家。如果您想获取程序目录,请参阅this question的答案。如果您使用FindBin包,他们会提到:

main = do
  exedir <- getProgPath
  handle <- openFile (exedir ++ "/primes-to-100k.txt") ReadMode
  ...