2013-03-29 115 views
-1

爲了更好地熟悉C++,我重做了一箇舊的大學OS作業:編寫自己的shell。我處理的第一件事是接受命令,但我的方法留下了一些需要的功能。下面是我有:正確的字符輸入?

string GetLine() { 
    string line; 
    char input = _getch(); 
    while (input != 13) { 
     switch (input) { 
     case 8: // backspace 
      if (line.length() != 0) { 
       line = line.substr(0, line.length() - 1); 
       cout << "\b \b"; 
      } 
      break; 
     case -32: // all arrows' first byte 
      input = _getch(); // distinctly different arrow byte 
      switch (input) { 
       case 72: // up 
        break; 
       case 80: // down 
        break; 
       case 75: // left 
        break; 
       case 77: // right 
        break; 
      } 
      break; 
     case 9: // tab 
      break; 
     default: 
      line += input; 
      cout << input; 
      break; 
     } 
     input = _getch(); 
    } 
    cout << endl; 
    return line; 
} 

它工作得很好,我知道我有更多的是用箭頭鍵(如果我連他們區分正確的是)。我所問的主要問題是某些情況,光標已經纏繞到終端上的下一行。旨在模擬cmd.exe我打印提示,並在其末尾等待用戶的輸入。當這個提示很長時,只需要幾個字符,然後我的命令在兩行之間運行。如果我只是輸入它,讓它環繞並按輸入一切工作正常。如果我換行到第二行並想退回到第一行,光標會停在新行的第一個字符處,並且不會像我希望的那樣「打開」回第一行。我可以在這裏做什麼來實現這種展開行爲?

我認爲問題是試圖打印'\ b'不會打開,但我沒有一個替代方案的想法,我希望我不必把這作爲一個特例並且將在行的中間退格的代碼也將在行的開頭起作用。

+0

您是否有能力使用libreadline?這樣可以在處理這件事時爲你節省很多心痛,並且有一整套技巧(如命令歷史等) –

回答

1

你需要使用winapi,SetConsoleCursorPosition會幫助你。下面是從當前位置移動光標上移一行的最小例如:

#include <iostream> 
#include <windows.h> 

int main() { 
    std::cout << "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 
     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 
     "aaaaaaaaaaaaaaa"; 
    HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 

    CONSOLE_SCREEN_BUFFER_INFO csbiInfo; 
    GetConsoleScreenBufferInfo(hStdout, &csbiInfo); 
    csbiInfo.dwCursorPosition.Y -= 1; // Move Y coordinate up by one 
    SetConsoleCursorPosition(hStdout, csbiInfo.dwCursorPosition); 

    std::cin.get(); 
} 

另外,Console Functions具有所有必要的功能的整個列表來控制控制檯。你會想在你的程序中使用這些。

您需要製作自己的屏幕緩衝區CreateConsoleScreenBuffer,然後將其設置爲緩衝區。然後在那之後處理從控制檯自己寫入和讀取的所有內容。

+0

這看起來是我唯一的選擇。 –

+0

@CoreyOgburn:在windows上,它可能是最好的選擇。像系統這樣的Unix可以使終端更容易工作。另一種方法是使用[ncurses for windows](http://gnuwin32.sourceforge.net/packages/ncurses.htm),並具有[wmove函數](http://hughm.cs.ukzn.ac.za/~ murrellh/OS /筆記/ ncurses.html#光標)。 –