重複の可能性:
std :: cinからパスワードを読み取ります
私はコンソールで正常に動作しないので、私の質問は答えるのが非常に簡単であるか、できないかもしれません。
cin
とcout
を「分離」して、コンソールに入力した内容がコンソールに直接表示されないようにすることはできますか?
これは、ユーザーがパスワードを入力できるようにするために必要です。通常、私もユーザーも、画面のplaintext
にパスワードが表示されることを望んでいません。
stringstream
でstd::cin.tie
を使用しようとしましたが、入力したものはすべてコンソールにミラーリングされています。
From テキストを非表示にする方法 :
Windows
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
int main()
{
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
DWORD mode = 0;
GetConsoleMode(hStdin, &mode);
SetConsoleMode(hStdin, mode & (~ENABLE_ECHO_INPUT));
string s;
getline(cin, s);
cout << s << endl;
return 0;
}//main
掃除:
SetConsoleMode(hStdin, mode);
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
Linux
#include <iostream>
#include <string>
#include <termios.h>
#include <unistd.h>
using namespace std;
int main()
{
termios oldt;
tcgetattr(STDIN_FILENO, &oldt);
termios newt = oldt;
newt.c_lflag &= ~ECHO;
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
string s;
getline(cin, s);
cout << s << endl;
return 0;
}//main
あなたは本当に2つの無関係な問題について尋ねています。cin.tie( NULL )
を呼び出すと、std::cin
とstd::cout
が完全に分離されます。しかし、それは下位レベルでは何にも影響しません。そして、最下位レベルでは、少なくともWindowsとUnixでは、std::cin
とstd::cout
は両方ともシステムレベルで同じデバイスに接続されており、それがそのデバイスです(Unixでは/dev/tty
)これはエコーを行います。標準をファイルにリダイレクトすることもでき、コンソールは引き続き入力をエコーします。
このエコーをオフにする方法は、システムによって異なります。最も簡単な解決策は、cursesやncursesなどのサードパーティライブラリを使用することです。これは、より高いレベルのインターフェイスを提供し、すべてのシステム依存関係を非表示にします。