- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当给定由\n 分隔的文本输入文件时,该程序会产生我期望的输出:
import System.IO
main :: IO ()
main = do h <- openFile "test.txt" ReadMode
xs <- getlines h
sequence_ $ map putStrLn xs
getlines :: Handle -> IO [String]
getlines h = hGetContents h >>= return . lines
用 withFile 替换 openFile 并稍微重新排列
import System.IO
main :: IO ()
main = do xs <- withFile "test.txt" ReadMode getlines
sequence_ $ map putStrLn xs
getlines :: Handle -> IO [String]
getlines h = hGetContents h >>= return . lines
我根本没有得到任何输出。我被难住了。
编辑:不再被难住了:感谢所有人深思熟虑且发人深省的答案。我又阅读了一些文档,了解到 withFile 可以理解为 bracket 的部分应用。
这就是我最终得到的结果:
import System.IO
main :: IO ()
main = withFile "test.txt" ReadMode $ \h -> getlines h >>= mapM_ putStrLn
getlines :: Handle -> IO [String]
getlines h = lines `fmap` hGetContents h
最佳答案
文件关闭得太早。来自 documentation :
The handle will be closed on exit from withFile
这意味着 withFile
函数返回后文件将立即关闭。
因为 hGetContents
和 friend 很懒,它不会尝试读取文件,直到用 putStrLn
强制它,但到那时,withFile
已经关闭了该文件。
要解决该问题,请将整个内容传递给 withFile
:
main = withFile "test.txt" ReadMode $ \handle -> do
xs <- getlines handle
sequence_ $ map putStrLn xs
这是有效的,因为当 withFile
开始关闭文件时,您已经打印了它。
关于haskell - withFile 与 openFile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9406463/
我想打开一个文件,将其拖放到应用程序图标上。当我这样做时,我的应用程序被打开,因此文件扩展名定义明确并且与我的应用程序相关。但是 application:openFile: 函数永远不会被调用。所以我
我正在尝试“即时”格式化openfiles.exe的输出,而不是将输出保存到CSV并导入。 如果我只运行openfiles /query /s SERVERNAME /fo table,我会得到 ID
我正在尝试编写一个程序来读取文件,同时允许其他应用程序访问它。我了解到,在 Windows 中,您需要传递 syscall.FILESHARE_READ/WRITE 标志以防止文件锁定。但是,引入这些
当我尝试向文件写入内容时出现“openFile - permission denied”错误: saveFile content path = do writeFile path (s
我一直在尝试在运行的 Eclipse session 中从命令行打开文件。基于documentation ,我应该可以做到 eclipse --launcher.openFile myfilename
当给定由\n 分隔的文本输入文件时,该程序会产生我期望的输出: import System.IO main :: IO () main = do h IO [String] getlines h =
我正在尝试创建一个aspx页面,在该页面中我可以直接将文件从客户端上传到服务器,而无需用户干预。我想做一些事情,比如当用户在 url 中指定文件路径时,必须将该特定文件上传到服务器。 示例:ht.tp
void openfile(FILE *fichier,char *str){ char path; path=(char*)malloc(sizeof(char)); fic
我一直在关注有关 allegro 5 平台游戏的教程,他的文件管理器使用 !openFile.eof(),我听说它不太好,我很确定它是什么给我一个 vector 下标超出范围错误。除了它还有什么我可以
Vista 引入了一个接口(interface):IFileDialog::SetFilter,它允许我设置一个过滤器,该过滤器将为每个可能的文件名调用以查看它是否应该显示给用户。 Microsoft
我正在尝试为 db4o 创建一个通用的助手类。 我创建了一个静态类,它应该在每个应用程序页面中充当助手。 这是我的代码: public final class DatabaseHelper imple
我目前遇到了 os.OpenFile 的问题。当我运行我的 go 测试时,它只是给我“权限被拒绝”。 type log struct { Message string Source
像这样使用时 [ [NSWorkspace sharedWorkspace] openFile:fileName withApplication:appName]; 并且文件名包含空格 另一个应用程序
我正在使用 kube-aws 在 AWS 上创建 kubernetes 集群,我有 kube-aws 版本 v0.12.3,当我尝试时,工作节点上经常出现“系统中打开的文件太多”的问题ssh 进入工作
大多数gif捕捉软件都是捕捉屏幕,然后将其一帧一帧的图片文件保存在磁盘上,然后读入内存并组合成gif,整个过程非常缓慢。 我想到了用DirectX捕获屏幕(这样我们也可以更快地捕获directx窗口,
我已经在 the msdn doc 中查看了这段代码: Stream myStream = null; OpenFileDialog openFileDialog1 = new OpenFileDia
我正在尝试编写一个应用程序,它可以处理 ftp 服务器上的文件。我需要在一个 ftp 连接中打开多个文件。我这样做 CInternetSession session(_T("Session1"));
当我以这样的模式打开文件时: file, _ := os.OpenFile("/path/to/my/file", os.O_RDWR|os.O_APPEND, os.FileMode(0666))
我想通过以下功能打开并引用工作簿。只有函数会产生运行时错误“91”:在跳回主代码之前未设置对象变量或 block 变量。 当我将确切的代码(只是不是函数)放入我的主代码时,它可以完美地工作。 但是我不
我已经在一个网站上工作了大约一个月,最近我尝试烘焙一些东西,现在我真的被刚刚弹出的缓存权限问题困住了。例如,我已经阅读了有关此问题的 stackoverflow 上的所有内容: SplFileInfo
我是一名优秀的程序员,十分优秀!