假设有人编写了一个打开某个文件的方法,并在某些情况下忘记关闭它。鉴于此方法,我是否可以确保文件已关闭而不更改原始方法的代码?
我看到的唯一选择是编写一个包装原始方法的方法,但只有在原始方法之外定义文件时才可以这样做,对吧?否则它会永远消失......
答案 0 :(得分:6)
由于这是C ++,我希望使用I / O流库(std::ifstream
和朋友),而不是遗留的C I / O库。在这种情况下,是的,文件将被关闭,因为流对象的析构函数关闭了流。
如果你使用的是旧版C API,那么不,你运气不好。
在我看来,像这样的面试问题的最佳答案是指出代码中的真正缺陷 - 手动管理资源 - 并建议正确的解决方案:使用自动资源管理(“资源获取是初始化” “或”范围限制资源管理“)。
答案 1 :(得分:2)
你是对的,如果包装器不以某种方式获得对打开文件的引用,则可能很难将其关闭。但是,操作系统可能提供获取打开文件列表的方法,然后您可以找到需要关闭的文件。
但是,请注意,大多数(几乎所有)操作系统在应用程序退出时负责关闭文件,因此您无需担心文件在程序停止后无限期地保持打开状态。 (这可能是也可能不是你给出的问题的合理答案,这看起来非常模糊和含糊不清。)
答案 2 :(得分:1)
如果您使用C函数打开文件,可以使用_fcloseall
功能关闭所有打开的文件。
如果你正在使用C ++,就像James建议的那样,流析构函数应该处理它。
答案 3 :(得分:0)
你在哪个环境?您始终可以检查流程打开的文件描述符并强行关闭它们。
在linux下,您可以使用lsof命令列出进程的打开文件。在方法之前执行一次,在方法之后执行一次以检测新打开的文件。希望你不要与一些多线程的传统野兽作斗争。