C++ iostreams与C标准输入输出库相比有什么优势?

4

可能重复:
你在C++代码中使用哪个I/O库?

我在另一个问题的评论中提出了这个问题,并被要求将其变成一个正式的问题。

为什么我想使用iostream而不是stdio?更具体地说,std::getline相对于C语言的等价物有什么优势?

请勿进行语言攻击。


5
你在C++代码中使用哪个I/O库?Which I/O library do you use in your C++ code?这篇文章对权衡做了很好的讨论。 - Matthew Flaschen
5个回答

11

有几个优点,主要是使用 <<>> 运算符。获取一行并没有太大的区别,不过能够将其读入到一个 std::string 中是一个相当大的优势。

C++ I/O 具有类型安全性。你不需要将参数列表写成引用字符串,然后再写一遍变量等内容。你只需要编写一次要打印的内容,C++ 会自动确定参数的数量和类型。当出现类型不匹配时,C I/O 可能会输出错误的结果,甚至会访问受保护的内存。

C++ I/O 易于扩展。一旦你有样例可供参考,你可以轻松地编写 operator<<()operator>>()。而 printf() 等函数则无法扩展,你只有固定的格式类型列表可选。

尽管 C++ I/O 乍看起来相当简单,但它具有很多程序员可访问的结构,因此一位优秀的 C++ 程序员可以修改它以涵盖 C I/O 无法处理的情况。(不要滥用这种能力。)


4

最大的收益是类型安全。在C语言中,格式化字符串没有类型(与OCaml或boost::format等语言不同),因此您可能会意外地做出一些相当恶心的事情。


2
  1. 您可以获得抽象的输入/输出/可寻址流,可以以任何方式实现。

    您可以向/从流中写入/读取数据,这些流可以是文件、内存、字符串甚至是自定义过滤器或zlib压缩器!

    一些C库提供了设置读/写处理程序的选项(BSD和Linux),但仍不具备与std::streambuf相同的功能,也不是标准。

  2. 您可以使用特定于流的语言环境,以线程特定的方式将数据按任何语言环境格式化到流中。

  3. 类型安全。
  4. 将通用对象(复杂变量、XML对象等)写入和从流中读取。

还需要翻译更多内容吗?


1
首先,如果您使用iostream,您将使用std :: string而不是char数组进行工作,这意味着您需要担心的内存管理要少得多。

1
你可以使用带有 std::string 的 .c_str() 在 printf 中进行输出。std::string 很好用,但它并不依赖于 iostreams。 - Chris
@Chris:但是对于字符串input没有任何东西吗? - UncleBens
@Chris 我特指的是std::getline()。它将一行读入到一个std::string,而不是fgets()读入到字符数组中。使用字符数组还需要正确分配内存空间,跟踪其大小并进行释放。 - Dima

0

如果你使用C++,你可能想要使用面向对象编程,对吧?我猜 cstdio(又名 stdio.h)只是为了与C兼容而存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接