CまたはC++でコンソールの目的の場所にカーソルを設定するにはどうすればよいですか?
と呼ばれる関数を覚えていgotoxy(x,y)
ますが、廃止されたと思います。代替手段はありますか?
CもC++も、画面やコンソールの概念を持っていません。固有の表示特性を持たないバイトのストリームのみが表示されます。それを支援するncursesのようなサードパーティのAPIがいくつかあります。
クイックアンドダーティソリューションが必要で、使用している端末がANSIエスケープシーケンスを理解している場合は、次のようなことができます。
printf("\033[%d;%dH", row, col);
カーソルを特定の行と列(左上隅は{1,1})に移動します。ただし、ncurses(またはプラットフォームの同等のもの)を使用する方がよいでしょう。
SetConsoleCursorPositionを使用します。
MSDNライブラリの同じ部分には他にもたくさんの関数があります。それらのいくつかも役立つかもしれません。
ncursesライブラリについて話している場合、必要な関数はですmove (row, column)
。
私は本当に簡単な方法を使用します。コンソールアプリケーションに実際に飛び込んでいない限り、HANDLEが何であるかを過度に知る必要はありません。COORDオブジェクトはwindows.h標準ライブラリにあり、2つのメンバーデータインターガーXとYがあります。0,0は左上です。コーナーとYが増加して、画面を下に移動します。このコマンドを使用して、引き続きstd :: cout <<を使用して、必要なものを印刷できます。
#include <windows.h>
int main(void){
//initialize objects for cursor manipulation
HANDLE hStdout;
COORD destCoord;
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
//position cursor at start of window
destCoord.X = 0;
destCoord.Y = 0;
SetConsoleCursorPosition(hStdout, destCoord);
}
これはstackoverflowにありました...
`#include <stdio.h>
// ESC-H, ESC-J (I remember using this sequence on VTs)
#define clear() printf("\033[H\033[J")
//ESC-BRACK-column;row (same here, used on terminals on an early intranet)
#define gotoxy(x,y) printf("\033[%d;%dH", (y), (x))
int main(void)
{
clear();
gotoxy(23, 12);
printf("x");
gotoxy(1, 24);
return 0;
}`
これを使用して、カーソルを画面上の特定の座標に設定し、cout <<またはprintfステートメントを使用して、コンソールに何かを印刷できます。
#include <iostream>
#include <windows.h>
using namespace std;
void set_cursor(int,int);
int main()
{
int x=0 , y=0;
set_cursor(x,y);
cout<<"Mohammad Usman Sajid";
return 0;
}
void set_cursor(int x = 0 , int y = 0)
{
HANDLE handle;
COORD coordinates;
handle = GetStdHandle(STD_OUTPUT_HANDLE);
coordinates.X = x;
coordinates.Y = y;
SetConsoleCursorPosition ( handle , coordinates );
}
Windowsの場合:#include <windows.h>
#define cursor(x、y)SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE)、(COORD){x、y})
Linuxの場合:
#define cursor(x、y)printf( "\ 033 [%d;%dH"、x、y)
カーソルを設定するためにこれを理解しました。
#include <iostream>
void setPos(std::ostream& _os, const std::streamsize& _x, const std::streamsize& _y)
{
char tmp = _os.fill();
if(_y>0) {
_os.fill('\n');
_os.width(_y);
_os << '\n';
}
if(_x>0) {
_os.fill(' ');
_os.width(_x);
_os << ' ';
}
_os.flush();
_os.fill(tmp);
}
int main(int argc, char **argv)
{
setPos(std::cout, 5, 5);
std::cout << "foo" << std::endl;
return 0;
}
さらに多くのことを行うには、解像度またはncursesのようなlibに関する仮定が必要になります。