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>