30 December 2023

C++ 核心指南目录

“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);

讨论

iostreamprintf() 系列的对比。人们经常提到的是 printf() 系列相比 iostream 有两个优势:灵活的格式化,较好的性能。我们在讨论这两点的时候,也要权衡一下 iostream 的一些其他优势:可扩展性优势、安全性、隐式内存管理、 locale 本地语言处理。

在 I/O 性能上, iostream 很多时候也比 printf() 好。

gets()scanf()printf() 用到了 %s 。这里存在严重的安全隐患(比如缓冲区溢出漏洞、容易出错)。C11 定义了一些额外的扩展,可以检查输入的参数。如果 C 程序库里有 gets_s()scanf_s()prinf_s() 等函数,可以考虑用这些函数,他们相对更安全些,但是他们仍然不是类型安全的。

强化

标记 <cstdio><stdio.h>