【问题标题】:stdio vs iostream [closed]stdio vs iostream [关闭]
【发布时间】:2013-06-21 19:49:02
【问题描述】:

当我在网上搜索这两个库的区别时,大家都说<iostream>是C++的标准I/O库,<cstdio>是C的。我的教授说cin>>和@987654324 @ 不是好的函数,如果我们多次使用cin>>,我们的应用程序肯定会崩溃。他还表示,stdio 提供的输入和输出速度比iostream 快近 3 倍。不过我更喜欢iostream,因为这样更方便,也不知道教授说的对不对。

那么你建议我用什么?

【问题讨论】:

  • 使用更适合您的应用程序的那个。此外,“如果我们多次使用 cin>>,我们的应用程序肯定会崩溃”是……迷信。
  • “如果我们多次使用 cin>>,我们的应用程序肯定会崩溃”。我还没有经历过,一次也没有。
  • 你需要找一个不同的老师,或者如果这不可能,意识到你现在的老师是无知的,学会忽视。
  • 你的教授是个白痴。如果您想用 C++ 编写代码,请使用 C++ I/O 函数,它们在可用性和类型安全性方面要好得多。您通常应该只将 cstdio 用于需要在 C 和 C++ 中工作的米老鼠应用程序或库。
  • @paxdiablo 我同意你的看法:D

标签: c++ io iostream stdio


【解决方案1】:

使用iostream 不会使您的程序崩溃。它可能很慢,但这只是因为它试图与stdio 互操作。可以关闭同步1iostream 是 C++ 获取输入的惯用方式,在大多数情况下,我建议在使用 C++ 时使用它而不是 stdio 函数。

1 使用std::ios::sync_with_stdio(false);

【讨论】:

  • @Sam379 你也可以阅读这篇文章stackoverflow.com/questions/9371238/…
  • 有些情况下 stdio 更可取;这种笼统的陈述不一定有帮助......
  • @OliCharlesworth,更好的是,我们可以有类型安全的版本,减少使用 C 版本的一些危险。
  • @icktoofay:嗯,使用printf 执行格式化的 I/O 通常(但并非总是)比使用流操纵器更简洁明了。
  • @OliCharlesworth Boost.Format。另外,在什么方面更清楚? sprintf 的规范使得基本上不可能用它编写合理的代码(未知的输出长度)这一事实并不受欢迎(即你可以使用它并且语法更短,但它会崩溃)。现在那就是搞砸了。
【解决方案2】:

在 C++ 中使用流,在 C 中使用 stdio.h。 是的,流有点慢,但是这些毫秒数吗?用户输入很少是应用程序的瓶颈。

如果正确使用流,并且您的编译器/运行时库正常,您的应用程序不会崩溃。

但是,如果你有充分的、可解释的理由来使用cstdio 函数,那么在 C++ 中使用它们也是完全合法的。

【讨论】:

  • 不仅仅是用户输入,还有与文件的任何交互......
  • @OliCharlesworth:你完全正确,我写了“输入”,因为问题主要是关于cin
  • 这是误导。任何产生中等大小输出的程序都会看到使用 cout 和 printf 之间的巨大差异
  • @andrepd,这取决于“中等大小”(输出)和“大”(差异)的定义。对于像tail 这样的工具,它肯定很重要,而对于商业应用程序,它通常 并不重要。
【解决方案3】:

除非 I/O 的性能真的很重要,否则请使用使您的程序最清晰(最易于阅读)的任何一种。

在我编写的大量程序中,只有少数需要对“I/O 有多快”进行特殊处理——而std::stream 函数的大部分问题都与实际解析输入 [以及与 stdio 同步] - 如果您正在阅读,比如说,浮点数,将很难编写您自己的版本 [接受std::stream 允许的全部格式]。

如果 I/O 性能真的很重要,那么使用 std::stream::readstd::stream::write 可能是解决方案,但在大多数情况下,最佳性能来自使用非便携式 mmapMapViewOfFile 接口“映射" 文件的内容直接从文件系统到应用程序的虚拟内存。这节省了复制数据处理所需的数量,并使其速度更快。

【讨论】:

    【解决方案4】:

    iostreams 库可能比较低级别的 stdio 库慢。 Streams 在幕后做了更多工作 - 类型转换、本地化、异常处理等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多