system("cls")
を使用する以外に、Cのコンソールウィンドウをクリアする「適切な」方法はありますか?
printf("\e[1;1H\e[2J");
この関数はANSI端末で動作し、POSIXを要求します。 ANSIエスケープシーケンスもサポートしているため、ウィンドウのコンソールでも動作するバージョンがあると思います。
#include <unistd.h>
void clearScreen()
{
const char *CLEAR_SCREEN_ANSI = "\e[1;1H\e[2J";
write(STDOUT_FILENO, CLEAR_SCREEN_ANSI, 12);
}
他にも alternatives があり、そのうちのいくつかはカーソルを{1,1}に移動しません。
Windows(cmd.exe)、Linux(Bashおよびzsh)およびOS X(zsh)でテストされた回避策:
#include <stdlib.h>
void clrscr()
{
system("@cls||clear");
}
マクロを使用すると、Windows、Linux、Mac、またはUnixを使用しているかどうかを確認し、現在のプラットフォームに応じてそれぞれの関数を呼び出すことができます。次のようなもの:
void clear(){
#if defined(__linux__) || defined(__unix__) || defined(__Apple__)
system("clear");
#endif
#if defined(_WIN32) || defined(_WIN64)
system("cls");
#endif
}
cls
に言及しているため、ウィンドウを参照しているようです。その場合、- このKB項目 にそれを実行するコードがあります。私はそれを試しましたが、次のコードで呼び出したときに機能しました:
cls( GetStdHandle( STD_OUTPUT_HANDLE ));
#include <conio.h>
そして使用
clrscr()
移植性のために、これを試してください:
#ifdef _WIN32
#include <conio.h>
#else
#include <stdio.h>
#define clrscr() printf("\e[1;1H\e[2J")
#endif
次に、clrscr()
を呼び出します。 Windowsではconio.h
のclrscr()
を使用し、LinuxではANSIエスケープコードを使用します。
本当に「適切に」実行したい場合は、仲介者(conio
、printf
など)を削除し、低レベルのシステムツールだけで実行できます。 (大規模なコードダンプの準備):
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
void ClearScreen()
{
HANDLE hStdOut;
CONSOLE_SCREEN_BUFFER_INFO csbi;
DWORD count;
DWORD cellCount;
COORD homeCoords = { 0, 0 };
hStdOut = GetStdHandle( STD_OUTPUT_HANDLE );
if (hStdOut == INVALID_HANDLE_VALUE) return;
/* Get the number of cells in the current buffer */
if (!GetConsoleScreenBufferInfo( hStdOut, &csbi )) return;
cellCount = csbi.dwSize.X *csbi.dwSize.Y;
/* Fill the entire buffer with spaces */
if (!FillConsoleOutputCharacter(
hStdOut,
(TCHAR) ' ',
cellCount,
homeCoords,
&count
)) return;
/* Fill the entire buffer with the current colors and attributes */
if (!FillConsoleOutputAttribute(
hStdOut,
csbi.wAttributes,
cellCount,
homeCoords,
&count
)) return;
/* Move the cursor home */
SetConsoleCursorPosition( hStdOut, homeCoords );
}
#else // !_WIN32
#include <unistd.h>
#include <term.h>
void ClearScreen()
{
if (!cur_term)
{
int result;
setupterm( NULL, STDOUT_FILENO, &result );
if (result <= 0) return;
}
putp( tigetstr( "clear" ) );
}
#endif
これを行うC移植可能な方法はありません。 cursesのようなさまざまなカーソル操作ライブラリは比較的移植性がありますが。 conio.h はOS/2 DOSとWindowsの間で移植可能ですが、* nixバリアントには移植できません。
「コンソール」の概念全体は、標準Cの範囲外の概念です。
純粋なWin32 APIソリューションを探している場合、WindowsコンソールAPIでこれを行うための単一の呼び出しはありません。 1つの方法は、十分な数の文字の FillConsoleOutputCharacter です。または WriteConsoleOutputGetConsoleScreenBufferInfo を使用して、十分な文字数を調べることができます。
また、まったく新しいコンソール画面バッファーを作成して、現在のものにすることもできます。
Windows:
system("cls");
Unix:
system("clear");
代わりに、すべてがスクロールされるまで改行文字を挿入し、 here を見てください。
これにより、移植性を簡単に実現できます。
clrscr()と入力するだけです。 void main()の関数。
例として:
void main()
{
clrscr();
printf("Hello m fresher in programming c.");
getch();
}
clrscr();
画面をクリアしやすい機能。
適切な方法は、tput
またはterminfo
関数を使用して端末プロパティを取得し、次元に応じて改行を挿入することです。