私のプログラムは、「\ x1B [J」(画面をクリア)などのエスケープシーケンスを含むテキストを出力しています。関連するアクションを実行せず、代わりにテキスト表現で表示されるようにエスケープシーケンスを抑制する方法はありますか?
\nと\rでこれを行うことにも興味があります。
私のプログラムは、「\ x1B [J」(画面をクリア)などのエスケープシーケンスを含むテキストを出力しています。関連するアクションを実行せず、代わりにテキスト表現で表示されるようにエスケープシーケンスを抑制する方法はありますか?
\nと\rでこれを行うことにも興味があります。
\
各オカレンスをに変更して、文字をエスケープし\\
ます。
これらのシーケンスは、ソースコードに入力した場合にのみ機能することに注意してください。次のプログラムの結果を確認してください。
#include <cstdio>
int main(int argc, char * argv[])
{
char test[3] = { 0x5c, 0x6e, 0x00 }; // \n
char * test2 = "\\n"; // \n
printf("%s\n", test);
printf("%s\n", test2);
printf(test);
printf(test2);
return 0;
}
どのレベルに介入したいかは明確ではありません。出力を記述している場合、最も簡単な解決策は、最初から文字を挿入しないことです。をライブラリに渡し、
std::ostream
それが文字を挿入している場合、出力ストリームにフィルタリングstreambufを挿入し、それらをフィルタリングするのはかなり簡単です。次のようなものは、標準のエスケープシーケンスのトリックを実行する必要があります。
class EscapeSequenceFilter
{
std::streambuf* myDest;
std::ostream* myOwner;
bool myIsInEscapeSequence;
protected:
int overflow( int ch )
{
int retval = ch == EOF ? ch : 0;
if ( myIsInEscapeSequence ) {
if ( isalpha( ch ) ) {
myIsInEscapeSequence = false;
} else if ( ch == 0x1B ) {
myIsInEscapeSequence = true;
} else {
retval = myDest->sputc( ch );
}
return retval;
}
public:
EscapeSequenceFilter( std::streambuf* dest )
: myDest( dest )
, myOwner( NULL )
, myIsInEscapeSequence( false )
{
}
EscapeSequenceFilter( std::ostream& dest )
: myDest( dest.rdbuf() )
, myOwner( &dest )
, myIsInEscapeSequence( false )
{
myOwner->rdbuf( this );
}
~EscapeSequenceFilter()
{
if ( myOwner != NULL ) {
myOwner->rdbuf( myDest );
}
}
};
フィルタリングする関数を呼び出す前に、出力ストリームを引数としてこのクラスのインスタンスを宣言するだけです。
このクラスは、必要に応じて他の文字をフィルタリングするために簡単に拡張できます。