CppCoreGuidelines SL.io.3 首选 iostream 处理 I/O
30 December 2023
“Prefer iostream s for I/O
理由
iostream 更安全、灵活、可扩展。
例子
// write a complex number: complex<double> z{ 3, 4 }; cout << z << '\n';
complex 是用户定义类型,它的 I/O 的定义都不需要修改 iostream 程序库。
例子
// read a file of complex numbers: for (complex<double> z; cin >> z; ) v.push_back(z);
讨论
iostream 与 printf() 系列的对比。人们经常提到的是 printf() 系列相比
iostream 有两个优势:灵活的格式化,较好的性能。我们在讨论这两点的时候,也要权衡一下 iostream 的一些其他优势:可扩展性优势、安全性、隐式内存管理、 locale 本地语言处理。
在 I/O 性能上, iostream 很多时候也比 printf() 好。
gets() 、 scanf() 、 printf() 用到了 %s 。这里存在严重的安全隐患(比如缓冲区溢出漏洞、容易出错)。C11 定义了一些额外的扩展,可以检查输入的参数。如果 C 程序库里有 gets_s() 、 scanf_s() 、 prinf_s() 等函数,可以考虑用这些函数,他们相对更安全些,但是他们仍然不是类型安全的。
强化
标记 <cstdio> 和 <stdio.h>