【问题标题】:Should I mix use printf with std::cin?我应该将 printf 与 std::cin 混合使用吗?
【发布时间】:2020-07-17 20:09:53
【问题描述】:

Update2:缓冲区是我在第二个问题中寻找的。谢谢。


更新:感谢您的回答。我会在 i/o 流上做更多的研究和实践。

如果您不介意,还有一个问题:

我有一些化学工程背景,我们经常需要处理 i/o 流之间随着时间的推移而积累的问题。

考虑到与物理材料流相比,数字信号或多或少是完美的 (?),这可能是一个奇怪的问题。但实际上,有没有可能发生类似的情况?

也许相关领域是网络安全?


我正在尝试与 C 一起练习 C++,并且我知道 C++ 在涉及某些特定事物(例如 std i/o)时更加通用和安全。

但是,尝试使用 std::cout 将句子分成小块非常令人沮丧。当您必须输入一个长字符串时,这项工作会呈指数级增长。与更简单的 printf 相比,这简直太违反直觉了。

例如:

// The same line of code with printf()
     printf("#%2d", i);

// Compared to C++ where I have to include the formatting library.

我的问题是,如果安全是 iostream 库的重点,那么严格使用 printf 用于输出和使用 std::cin 用于输入是否安全?

【问题讨论】:

  • 安全不是<iostream>的唯一原因。它提供的远不止这些。
  • 完全同意,但比 printf 更好的解决方案是使用 boost 格式库,boost.org/doc/libs/1_66_0/libs/format/doc/format.html
  • cin 似乎无关紧要。听起来您的问题只是在 C++ 程序中使用 printf() 是否可以。
  • 您所问的主要是基于意见的。 C++ 流和 C 库的 stdio 之间存在一些交互,这可以在某些极端情况下发挥作用,但这种情况非常罕见。但是,更重要的是,您应该尽最大努力与流达成交易。如果您认为流很困难,那么您还什么都没看到。 C++ 是当今使用的最复杂的通用编程语言,C++ 的复杂部分比流要多得多。
  • C++20 引入了字符串格式化。在 python 样式中使用 cout

标签: c++ c printf


【解决方案1】:

所以你的问题是:将 printf 与 cin 混合使用是否安全?

答案是肯定的!是的,我们可以,您可以在 C++ 中使用 C 函数和库,尽管 C++ 更安全并且应该更优化,但有时 printf 比 cin 快得多,但这取决于您要打印的内容。 printf 必须解析您输入的字符串,而 cin 也必须执行一些复杂的操作。同样正如@Sebastian 所指出的,速度会因您刷新输入缓冲区的数量而异。

假设我想使用 printf 和 std::cout 打印字符串“Hello, World” 10,000 次而不使用任何新行,通过在我的机器上尝试这个,我得到了以下结果:

printf 耗时 11619360 [µs] -> 11.61936 [s]

cout 耗时 3243804 [µs] -> 3.243804 [s]

以下是以下代码:

#include <iostream>
#include <chrono>
#include <stdio.h>
int main()
{
    std::chrono::steady_clock::time_point time1 = std::chrono::steady_clock::now();
    for(unsigned int i=0;i<10000;i++)
    {
        printf("Hello, World");
        //std::cout << "Hello, World";
    }
    std::chrono::steady_clock::time_point time2 = std::chrono::steady_clock::now();

    std::cout << "Duration " << std::chrono::duration_cast<std::chrono::microseconds>(time2 - time1).count() << " [µs]" << std::endl;
    return 0;
}

这里 std::cout 比 printf 快,但这完全取决于您要打印的内容

【讨论】:

  • 速度也可能取决于函数刷新输出的频率
  • 那也是@Sebastian
  • 解耦 C++ 流 (std::cin, std::cout) 和 CI/O 缓冲区 (stdin, stdout) 可以提高性能,但只能使用其中之一,因为它们不再一起玩。
  • 值得一提的是,在多线程/并发编程环境中,与 printf 和 readline 混合使用 iostream 缓冲区(cout、cin 和 c)确实不安全。然而,除此之外,这个答案几乎是正确的。
猜你喜欢
  • 2013-03-15
  • 1970-01-01
  • 2011-09-09
  • 2019-03-26
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多