2013-01-08 356 views
3

我正在編寫一個程序,直接從用戶輸入讀取數據,並想知道如何才能讀取所有數據,直到鍵盤上的ESC按鈕被按下。我發現只是這樣的:如何閱讀,直到從CIN按下ESC按鈕C++

std::string line; 
while (std::getline(std::cin, line)) 
{ 
    std::cout << line << std::endl; 
} 

但需要添加一個便攜的方式(Linux/Windows)來捕獲一個ESC按鈕,然後打破一個while循環。這個怎麼做?

編輯:

我寫了這一點,但仍然 - 即使我按下鍵盤上的ESC的按鈕的工作原理:

#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    const int ESC=27; 
    std::string line; 
    bool moveOn = true; 

    while (std::getline(std::cin, line) && moveOn) 
    { 
     std::cout << line << "\n"; 
     for(unsigned int i = 0; i < line.length(); i++) 
     { 
      if(line.at(i) == ESC) 
      { 
       moveOn = false; 
       break; 

      } 
     } 
    } 
    return 0; 
} 

EDIT2:

傢伙,這soulution不起作用它也會吃掉我的第一個字符!

#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    const int ESC=27; 
    char c; 
    std::string line; 
    bool moveOn = true; 

    while (std::getline(std::cin, line) && moveOn) 
    { 
     std::cout << line << "\n"; 
     c = cin.get(); 
     if(c == ESC) 
      break; 

    } 
    return 0; 
} 
+0

您可以設置'常量int ESC = 27;',然後在循環中使用'c = getch()',然後檢查'c'是否等於'ESC'終止。 – Maroun

+0

@MarounMaroun:不是getch();只有Windows解決方案...? – Katie

+0

使用cin.get()而不是getch() – abnvp

回答

6
int main() { 
    string str = ""; 
    char ch; 
    while ((ch = std::cin.get()) != 27) { 
    str += ch; 
    } 

cout << str; 

return 0; 
} 

這需要輸入到您的字符串,直到它遇到轉義字符

1

在閱讀的路線,雖然走的所有字符你剛纔讀,尋找逃逸ASCII值(十進制27)。


這裏就是我的意思是:

while (std::getline(std::cin, line) && moveOn) 
{ 
    std::cout << line << "\n"; 

    // Do whatever processing you need 

    // Check for ESC 
    bool got_esc = false; 
    for (const auto c : line) 
    { 
     if (c == 27) 
     { 
      got_esc = true; 
      break; 
     } 
    } 

    if (got_esc) 
     break; 
} 
+0

的確如你所說,你能否看到我的編輯並說出它是否適合你?歡呼聲:) – Katie

+0

@Katie:你應該每次使用cin.get()時都會得到一個字符,只要你看到ESC – abnvp

+1

@Katie就會中斷。不,我的意思是你應該迭代字符串'line'。 _或__使用'std :: cin.get()'一次讀取一個字符。 –

1

我發現,這個工程讓輸入Escape鍵,您還可以在while函數中定義和列出其他值。

#include "stdafx.h" 
#include <iostream> 
#include <conio.h> 

#define ESCAPE 27 

int main() 
{ 
    while (1) 
    { 
     int c = 0; 

     switch ((c = _getch())) 
     { 
     case ESCAPE: 
      //insert action you what 
      break; 
     } 
    } 
    return 0; 
} 
0
#include <iostream> 
#include <conio.h> 

using namespace std; 

int main() 
{ 
    int number; 
    char ch; 

    bool loop=false; 
    while(loop==false) 
    { cin>>number; 
     cout<<number; 
     cout<<"press enter to continue, escape to end"<<endl; 
     ch=getch(); 
     if(ch==27) 
     loop=true; 
    } 
    cout<<"loop terminated"<<endl; 
    return 0; 
} 
0

我建議在C不僅是ESC字符++,但對鍵盤在任何語言的任何其他字符,讀取的字符,你輸入一個整型變量,然後打印出來的整數。

無論是在線搜索還是在線搜索ASCII字符列表。

這會給關鍵的你ASCII值,那麼它的樸素簡單

if(foo==ASCIIval) 
    break; 

對於ESC字符,ASCII值是27