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

Lar*_*rry 6 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
Run Code Online (Sandbox Code Playgroud)

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

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

关键是代码在 ghci 和 runhaskell 上运行良好,但可执行文件找不到输入 txt。

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

Ony*_*ite 4

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

编辑:刚刚从您的其他评论中看到您使用的是 OS X,并且(我假设)正在双击该程序。根据你的说法,我猜 OS X 将此类执行程序的当前目录设置为你的主目录。如果您想获取程序的目录,请参阅此问题的答案。如果您使用FindBin他们提到的软件包:

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