在 FILE 对象上使用 fstream

Using fstreams over FILE objects

本文关键字:fstream FILE 对象      更新时间:2023-10-16

我是一个C++初学者,刚刚完成C++入门,我正在玩我自己的几个项目。我在这样做时注意到的一件事是,虽然C++ Primer倾向于强调std::fstream作为文件IO的方法,但许多程序反而使用FILE*

这有什么原因吗?如果有,在什么情况下你会/应该使用fstream而不是FILE或者是否有我不知道的第三种选择,你会推荐?

谢谢!

在C++中使用 stdio(即FILE*系列函数(的唯一原因是与 C 代码交互,获取FILE*参数。许多使用 stdio 学习 C 和/或C++的人认为这些功能在某种程度上是优越的。主要的抱怨是使用 stdio 的格式说明符要短得多。不幸的是,它们也容易出错,尽管警告指出格式说明符和实际参数之间的不一致,但我还没有看到一个使用 stdio 的程序非平凡且正确。

在IOstreams中,stdio做得更好的一个遗漏是scanf()函数可以做一些有趣的解析。这可以很容易地添加到IOstreams中,但它不是标准库的一部分(它不像格式说明符那样简洁(。

就个人而言,我认为与优点相比,缺点无关紧要:

  • 类型安全的读写
  • 对用户定义
  • 类型的用户定义支持
  • 支持用户定义的源和目标
  • 在较小程度上控制数字类型的格式

由于一系列文章和早期IOstreams的一些极其糟糕的实现(其中一些似乎仍然在流行的平台中徘徊(,C++流获得了缓慢的错误声誉。是的,可以确保它们比 stdio 慢得多,但绝对有可能以与 stdio 相似的性能实现它们。但是,用户需要避免一些简单的性能错误:

  1. 请勿使用 std::endl .时期。如果你真的想写一个换行符,然后是同花顺,那就说:out << 'n' << std::flush。这就是std::endl所做的,但在绝大多数情况下std::endl被错误地使用,意外刷新会导致重大性能问题。
  2. 确保库不会浪费时间与 stdio 操作保持同步:调用std::sync_with_stdio(false);,除非您将输出混合到标准流对象(std::cin 等和 stdin 等(。尽管只有标准流对象才需要效果,但 IOstream 的不良实现也会影响文件流。