在 FILE 对象上使用 fstream
Using fstreams over FILE objects
我是一个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 相似的性能实现它们。但是,用户需要避免一些简单的性能错误:
- 请勿使用
std::endl
.时期。如果你真的想写一个换行符,然后是同花顺,那就说:out << 'n' << std::flush
。这就是std::endl
所做的,但在绝大多数情况下std::endl
被错误地使用,意外刷新会导致重大性能问题。 - 确保库不会浪费时间与 stdio 操作保持同步:调用
std::sync_with_stdio(false);
,除非您将输出混合到标准流对象(std::cin
等和stdin
等(。尽管只有标准流对象才需要效果,但 IOstream 的不良实现也会影响文件流。
相关文章:
- Seg Fault Issue C++ (file IO / getline)
- 在fstream期间忽略空行
- 使用fstream对txt文件中的数字进行循环
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 无法打开 fstream C++文件,即使它与 .cpp 位于同一位置
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- 使 std::fstream 写入文件末尾,但从头开始读取
- File.cpp.o:OpenPose 标志 CMakeFiles/.. 的多重定义/main.cpp.o:首先在这里定
- Visual Studio C++ Project File CustomBuild Task: Filter Outp
- 为什么当我在 std::string 中打开文件名的 fstream 时出现"no matching function"错误?
- 已解决 - C++ 的崇高文本中的"fatal error: opencv: no such file or directory"
- 可视化 如何在C++中将字符数组转换为 FILE 类型
- 自定义 std::fstream,std::filebuf 的溢出和下溢函数未为每个字符调用
- 如何在从文件中读取整数时使用 file.eof()?
- "No such file or directory" C++标头问题
- 在 FILE 对象上使用 fstream
- "No such file or directory" 使用 makefile 时在 c++ 中执行简单 fstream 时出错
- C++ FILE to fstream?
- FILE vs fstream