【问题标题】:C++: Reading characters before pressing ENTERC++:在按 ENTER 之前读取字符
【发布时间】:2013-05-22 12:22:30
【问题描述】:

现在有几个小时,我试图弄清楚如何在按 ENTER 之前从 cin 读取字符(通过使用线程)。我知道 conio.h 库,但我不想使用它。

我编写了一个简单的程序,它从用户那里获取数据并将其保存在“msg”字符串中。程序具有每秒清除控制台的子线程。我想做的是:

  1. 用户输入了一些数据,但没有按 ENTER,因此它没有保存在“msg”变量中。
  2. 控制台清除
  3. 发送到 cout 用户输入的字符,所以他甚至不会注意到控制台已被清除。

PS。对不起我的英语,这是程序:

#include<iostream>
#include<string>
#include<winsock2.h>
#include<process.h> 
#include<windows.h>
using namespace std;


void __cdecl ThreadProc( void * Args )
{

    while( true ){
        system("cls");
        cout << "Input: ";
        /*
        char c;
        while((c=cin.peek()) != '\n')
            cin.get(c);
        cout << c;
        */
        Sleep(1000);
    }
    _endthread();
}


int main(){
    HANDLE hThread =( HANDLE ) _beginthread( ThreadProc, 0, NULL );

    while (true){
        string msg;
        getline(cin,msg);
        cout << "MSG:" << msg << endl;
        cin.clear();
        fflush(stdin);
    }
    return 0;
}

编辑:

键盘记录器?不,我正在做控制台网络聊天。目前服务器和客户端可以互相聊天。收到或发送新消息时,保存在“vector chat”中,控制台刷新如下代码:

void show_chat(){
    system("cls");
    for(unsigned int i =0;i<chat.size();i++){
        cout << "[" << date[i].tm_hour << ":" << date[i].tm_min << ":" << date[i].tm_sec << "] " << chat[i] << endl;
    }
    cout << "Input: ";
}

因此,如果在用户编写自己的消息时收到新消息,则会出现问题。在 message system("cls") 之前写入的部分消息在屏幕上丢失了。

【问题讨论】:

  • 没有标准的 C++ 库函数可以做到这一点。您必须使用特定于操作系统的代码(而不是 cin - 但您可能会做一些适合您的类似事情),或者使用第三方库(curses 或类似的)。
  • 不确定您为什么要这样做。你在写键盘记录器吗?
  • 另外,在多个线程中使用cin 几乎肯定会导致各种坏事。
  • @UP 我不是在写键盘记录器,而是聊天程序。刚刚编辑了帖子。

标签: c++ multithreading cin conio


【解决方案1】:

要做你想做的事,你需要合并一个消息队列和更新方法。

你能按照你介绍的方式做吗?当然可以,但这会很痛苦,而且 cin 无法做到这一点。

只需在双方都有一个消息队列,每个客户端的当前状态(able_to_receive_messages,Unable 等),并在用户再次能够接收消息后运行每个客户端调用的更新方法。

【讨论】:

    猜你喜欢
    • 2017-06-26
    • 2021-07-12
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    相关资源
    最近更新 更多