2013-05-22 63 views
1

對於現在幾個小時,我想弄清楚如何在按ENTER鍵(通過使用線程)之前從cin中讀取字符。我知道conio.h庫,但我不喜歡使用它。C++:按ENTER之前閱讀字符

我寫了一個簡單的程序,從用戶獲取數據並將其保存在'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; 
} 

編輯:

主要記錄器?那麼,我正在進行控制檯網絡聊天。目前,服務器和客戶端可以與對方聊天。如果在用戶編寫自己收到新的消息

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: "; 
} 

因此,有一個問題:當接收或發送新郵件時,它被保存在「矢量< \字符串>聊天」,並刷新控制檯下面的代碼信息。在消息系統(「cls」)之前寫入的部分消息在屏幕上丟失。

+0

沒有標準的C++庫函數來執行此操作。你必須使用特定於操作系統的代碼(而不是'cin' - 但你可能會做類似的工作),或者使用第三方庫(curses或類似的)。 –

+0

不確定你爲什麼要這樣做。你在寫密鑰記錄器嗎? –

+0

另外,使用來自多個線程的'cin'幾乎肯定會導致各種不好的事情。 –

回答

0

要做你想做的事,你需要合併消息隊列和更新方法。

你能以你提出的方式去做嗎?當然,但這將是一個重大的痛苦,沒有辦法用cin來做到這一點。

只需在雙方都有一個消息隊列,每個客戶端的當前狀態(able_to_receive_messages,unable等),並且在用戶再次能夠接收消息後運行由每個客戶端調用的更新方法。