1

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

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

谢谢!

4

1 回答 1

2

在 C++中使用 stdio(即FILE*函数族)的唯一原因是为了与 C 代码进行接口以获取FILE*参数。许多使用 stdio 学习 C 和/或 C++ 的人相信这些功能在某种程度上更胜一筹。主要的抱怨是使用 stdio 的格式说明符要短得多。不幸的是,它们也容易出错,尽管警告指出格式说明符和实际参数之间存在不一致,但我还没有看到一个使用标准输入输出的程序不平凡且正确。

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

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

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

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

  1. 不要使用std::endl. 时期。如果你真的想写一个换行符,然后是一个刷新,这样说:out << '\n' << std::flush。这就是在绝大多数情况下使用std::endl但不正确的方法,因为意外刷新会导致严重的性能问题。std::endl
  2. 确保库不会浪费时间与 stdio 操作保持同步:std::sync_with_stdio(false);除非您将输出混合到标准流对象(std::cin等和stdin等),否则调用。尽管只有标准流对象才需要该效果,但 IO 流的不良实现也会影响文件流。
于 2012-05-13T22:43:23.227 回答