【发布时间】:2022-01-09 17:14:07
【问题描述】:
我正在制作一个加载类型的函数,所以我想做的是暂停我的程序几秒钟,然后在循环内恢复执行,使其看起来像一个加载过程。在网上查找我发现我可以使用std::this_thread::sleep_for() 来实现这一点(我在linux上这样做)。我面临的问题是,我无法使用\r 或任何其他方式覆盖最后输出的百分比,因为程序一执行就冻结,但是它与\n 完美配合,仅此而已令人困惑的是为什么它可以使用换行符序列而不是\r。
我在下面发布示例代码,有人可以告诉我我做错了什么吗?
#include<iostream>
#include<chrono>
#include<thread>
int main()
{
for (int i = 0; i<= 100; i++)
{
std::cout << "\r" << i;
std::this_thread::sleep_for(std::chrono::seconds(rand()%3));
}
return 0;
}
我对这个话题有点陌生,经过一番挖掘后,我发现我在搞乱线程。但仍然不确定为什么会发生这种行为。
【问题讨论】:
-
你可以只刷新流吗? cout 被缓冲。见stackoverflow.com/questions/22026751/…
-
程序未冻结。如果设置断点,您将看到
std::cout << "\r" << i;确实每隔几秒运行一次。问题是您没有刷新输出,因此结果仍在缓冲区中等待打印。它适用于\n,因为在打印\n时会自动刷新。但是\r没有这个特殊属性。 -
非常感谢您的回复,添加 std::flush 完成了这项工作,但现在我无法理解的是为什么会这样?我的意思是我第一次用
\r打电话给 cout 时,它仍然应该打印一些东西,对吗?但如果我不刷新流,它根本不会打印任何东西。它与std::this_thread::sleep_for或只是cout函数有关吗?我在这里错过了什么吗?也许执行图表或类似的东西会很有用,或者对该主题进行进一步的阐述。并再次感谢您为我解决这个问题。 :) -
@RaymondChen 请将您的评论移至答案。
标签: c++