在FILE对象上使用fstream

时间:2012-05-13 21:40:27

标签: c++ io

我是C ++初学者,刚刚完成了C ++ Primer,我正在玩一些自己的项目。我注意到的一点是,虽然C ++ Primer倾向于强调std::fstream作为文件IO的方法,但许多程序使用FILE*

这有什么理由吗?如果有的话,在什么情况下/ fstream会使用FILE还是{3}}或者我建议您不知道第3个选项?

谢谢!

1 个答案:

答案 0 :(得分:2)

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

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

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

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

由于早期IOstream的一系列文章和一些非常糟糕的实现(其中一些似乎仍然停留在流行的平台中),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的实现也很糟糕,这也会影响文件流。