如何为 getline() 实现超时? [复制]

Posted

技术标签:

【中文标题】如何为 getline() 实现超时? [复制]【英文标题】:How to implement timeout for getline()? [duplicate] 【发布时间】:2013-03-09 13:57:10 【问题描述】:

我想在 C++ 中通过getline() 从命令行读取一个字符串。

为此,我想添加一个5 秒的计时器。如果没有读取字符串,则程序将终止。

我该怎么做?

【问题讨论】:

@RandyHoward :我不认为这是完全重复的。 getline() 使用起来要简单得多,并且知道如何为其添加计数器对新手很有用。这个问题应该是合法的。 @kassak :不,仍然不是完全重复的,我认为答案表明了这一点。无论哪种方式,我认为这是一个有用的问题,因为getline() 被大量使用,知道如何使用它对未来的读者有好处。只是我的 2 美分。 *** 不适合回答这个问题。我们不会为您编写代码。您需要自己编写代码,如果您不确定为什么某些事情没有按预期工作,请发布代码并说明您期望它做什么,以及它实际上在做什么,包括所有错误消息。见about ***。 @LightnessRacesinOrbit 我会说这个问题没问题(编辑后),因为它有quite good answer @BЈовић 你错了。 【参考方案1】:

好的,等待5 秒,如果没有输入则等待terminate

#include <thread>
#include <atomic>
#include <iostream>
#include <string>

int main()

    std::atomic<bool> flag = false;
    std::thread([&]
    
        std::this_thread::sleep_for(std::chrono::seconds(5));

        if (!flag)
            std::terminate();
    ).detach();

    std::string s;
    std::getline(std::cin, s);
    flag = true;
    std::cout << s << '\n';

【讨论】:

标准溶液+1,呵呵 不使用线程 pllzzz... @user2164410 - 为什么不呢 - 这是处理此类要求的常用方法。在 5 秒结束之前允许输入线路的信号同样容易,而不是等到间隔结束。 -Martin James 没关系.. 但是,现在我想要的是.. 如果我在 5 秒后没有读取任何字符串,我不想退出程序,我需要调用另一个函数然后回到 getline()。 (循环)。谢谢 -Abyx 它给出了许多编译时错误.. 编译代码一次.. 如果可能的话,不要包含任何线程。谢谢【参考方案2】:

怎么样:

/* Wait 5 seconds. */
alarm(5);

/* getline */

/* Cancel alarm. */
alarm(0);

您也可以使用setitimer


作为R。 Martinho Fernandes 要求:

函数alarm 安排当前进程在其调用后的 5 秒内接收 SIGALRM。 SIGALRMsi 异常终止进程的默认操作。调用 alarm(0) 会禁用计时器。

【讨论】:

我想知道是否有办法关闭并重新打开标准输入或通过 getline 语句...? @cnicutar Thnq。它起作用了:P 最后我得到了“闹钟”的输出。怎么压制那个???谢谢@cnicutar 如果这回答了您的原始问题,最好接受这个答案,并提出一个关于“闹钟”输出显示您的代码的新问题。 alarm(0) 应该禁用计时器。

以上是关于如何为 getline() 实现超时? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何为默认的swagger android客户端设置连接和套接字超时

如何为枚举对象实现增量函数? [复制]

如何为 AndroidAsync websockets 设置超时?

如何为查询执行设置语句超时

如何为 liquibase 变更集设置超时?

如何为 cassandra 设置读取请求超时