私はあなたが実際に入力が最終的な出力とに沿ったものにしたいと仮定します。そうでなければ、溶液は自明である:最初の値を読み取り、それを印刷し、例えば:
std::cout << "how old are you? ";
std::cin >> x;
std::cout << "I am " << x << " years old\n";
出力とラインにある入力を扱うもう少しトリッキーです。ここでの問題は、コンソール操作が実際には言語ではなくシステムによって行われることです。その結果、データを入力するときに改行を待つ必要があります。改行はコンソールで処理され、改行が作成されます。この動作を無効にするには、コンソールの動作に依存する必要があります。これを行うための標準的なC++の方法はありません。
私はWindows上でコンソールコントロールを処理する方法がわかりません。私は主にUNIXプログラマです。 UNIXシステムでは、入力モードを非正規(すなわち、ICANON
ビットをクリアする)に設定するには、tcgetattr()
とtcsetattr()
を使用します。必要なファイル記述子は、単に標準入力用のファイル記述子、つまり0
です。
コンソールが非標準モードを使用すると、すべてのキー押下が直ちにアプリケーションに転送され、画面エコーは行われません。結果として、読み込み関数は実際には個々の文字をエコーし、次に解析関数に転送する必要があります。最も簡単な方法は、文字を転送しながらstd::cin
〜std::cout
に必要なエコーを行うフィルタリングストリームバッファを作成することです。しかし、それをまとめることはちょっとした作業です...
デモを調理するとき、エコーに対処する必要があることに気付きました(ユーザーがEnterキーを使用するときに改行を避けるため)。また、コンソールフラグをリセットすることも重要です。コンソールフラグの一部は、プログラムが終了しても実際に変更されているためです。実装は、一緒にビットを置くが、それでもエラー処理を欠いていることは、このようになります。
#include <iostream>
#include <ctype.h>
#include <termios.h>
struct non_canon_buf
: std::streambuf {
char buffer;
non_canon_buf() {
termios flags = {};
tcgetattr(0, &flags);
flags.c_lflag &= ~(ICANON | ECHO);
tcsetattr(0, TCSANOW, &flags);
}
~non_canon_buf() {
termios flags = {};
tcgetattr(0, &flags);
flags.c_lflag |= ICANON | ECHO;
tcsetattr(0, TCSANOW, &flags);
}
int underflow() {
if (std::cin.get(buffer)) {
this->setg(&buffer, &buffer, &buffer + 1);
if (!std::isspace(static_cast<unsigned char>(buffer))) {
std::cout << buffer << std::flush;
}
return std::char_traits<char>::to_int_type(buffer);
}
return std::char_traits<char>::eof();
}
};
int main()
{
non_canon_buf sbuf;
std::istream in(&sbuf);
std::cout << "I am ";
int age = 0;
in >> age;
std::cout << " years old\n";
if (!in) {
std::cout << "ERROR: failed to enter a valid age!\n";
}
}
のように行うことができます。これは私にはあまり意味がありません。最初に*年齢を入力して 'std :: cout <<"を出力するようにしてはいけません。私は "<< x <<"歳です。\ n "'全体として? – 5gon12eder
あなたは、ユーザーが年齢を入力できる空白のようなものを考え出していますか?そうであれば、残念ながら、それはテキストベースのシステムが一般的にどのように機能するかではありませんが、これは[ncurses](https://en.wikipedia.org/wiki/Ncurses)で行うことができると確信しています。複雑です。 – Numeri
改行なしで何かを入力する方法は、ストリームのバッファリングをオフにすることです。しかし、それはあなたが使用しているOSに依存し、C++の一部ではありません。たとえば、Windowsでは文字を画面にエコーすることなく文字を取得し、後でどの文字を画面に表示するかを決めることができます。 –