从输入缓冲区读取

Posted

技术标签:

【中文标题】从输入缓冲区读取【英文标题】:Reading from input buffer 【发布时间】:2018-05-29 20:29:13 【问题描述】:
void dr1() 
    int num1 = 0, num2 = 0;
    char str[100];  

    while (str[0] != '|') 
        cout << "Please enter two numbers (enter \"|\" to terminate): ";

        cin >> num1;
        cin >> num2;
        cin.getline(str, 100);

        cout << num1 << num2 << endl;
    

如果用户输入一个字符串,变量str不应该从输入缓冲区中读取它吗?

据我所知,您不能将字符串字符输入int 类型,因此它们会留在缓冲区中。如果它们留在缓冲区中,getline() 不应该读取缓冲区中留下的任何输入吗?

【问题讨论】:

您是在问num 读取是否失败,线路读取不应该消耗线路并继续前进吗?如果是这样,则需要在getline之前重置流状态,并且在这样做之前需要检测失败。 这可能是你需要的:***.com/questions/10828937/… 当您需要根据用户输入的内容执行不同的操作时,最好的选择是逐行读取输入并使用std::istringstream 处理每一行。 @NathanOliver 发布的链接是一个很好的起点。 【参考方案1】:

如果operator&gt;&gt; 未能读取格式化值,则输入确实留在缓冲区中,并且流也进入错误状态,因此后续读取将被忽略并且也会失败。这就是getline() 没有按预期读取"|" 输入的原因。在格式化读取操作失败后,您需要clear() 流的错误状态。例如:

void dr1()

    int num1, num2;
    char str[100];
    do
    
        cout << "Please enter two numbers (enter \"|\" to terminate): " << flush;
        if (cin >> num1)
        
            if (cin >> num2)
            
                // use numbers as needed...
                cout << num1 << num2 << endl;
                continue;
            
        
        cin.clear();
        if (!cin.getline(str, 100)) break;
        if (str[0] == '|') break;
    
    while (true);

【讨论】:

以上是关于从输入缓冲区读取的主要内容,如果未能解决你的问题,请参考以下文章

在 C 中使用 fread 从标准输入缓冲读取

在程序集中从键盘读取缓冲区

C++ 以缓冲速率从 STDIN 读取输入

如何使用 NAudio 和 ASIO 直接读取输入缓冲区和播放?

scanf()函数分析

安卓 | Kotlin:应用程序从 InputStream 读取到缓冲区问题