001
14.01.2012, 17:23 Uhr
0xdeadbeef
Gott (Operator)
|
Zunächst ist
eher C als C++ - in C++ schriebe man
Was dein Vorhaben angeht: Weder der C- noch der C++-Standard decken das ab, aber es gibt andere Spezifikationen dafür. Unter Unices aller Art (das schließt Linux mit ein und sollte auch unter Mac OS X gehen) ginge das beispielsweise so:
C++: |
#include <iostream> #include <termios.h> #include <unistd.h>
int main() { struct termios attr_old, attr_new; int x;
// Terminaloptionen holen tcgetattr(STDIN_FILENO, &attr_old);
// Echo-Flag abschalten, dabei alte Optionen merken (d.h. Änderungen an // Kopie) und neue Terminal-Optionen anwenden attr_new = attr_old; attr_new.c_lflag &= ~ECHO; tcsetattr(STDIN_FILENO, TCSANOW, &attr_new);
std::cin >> x; // respektive scanf("%d", &x);
// Am Ende die alten Optionen wieder herstellen. tcsetattr(STDIN_FILENO, TCSANOW, &attr_old);
std::cout << x << std::endl; // respektive printf("%d\n", x); }
|
In C++ sollte man das natürlich in einen RAII-Wrapper verpacken; denkbar wäre beispielsweise
C++: |
#include <iostream>
#include <termios.h> #include <unistd.h>
class tcattr_raii { public: tcattr_raii(int fd = STDIN_FILENO) : fd_(fd) { tcgetattr(fd_, &attr_old_); attr_new_ = attr_old_; }
struct termios &attr() { return attr_new_; } void apply(int when = TCSANOW) { tcsetattr(fd_, when, &attr_new_); }
~tcattr_raii() { tcsetattr(fd_, TCSANOW, &attr_old_); }
private: int fd_; struct termios attr_old_; struct termios attr_new_; };
int main() { tcattr_raii termoptions; int x;
termoptions.attr().c_lflag &= ~ECHO; termoptions.apply();
std::cin >> x; std::cout << x << std::endl; }
|
...jetzt nur so hingekladdet. Wahrscheinlich wäre es am Ende sinnvoller, die Implementationsdetails zu verstecken und ein Interface zu entwerfen, das dem entspricht, was man wirklich braucht; dann ist das später leichter zu portieren.
Unter Windows geht das bestimmt auch irgendwie, aber wie genau weiß ich aus dem Stand nicht. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 14.01.2012 um 17:23 Uhr von 0xdeadbeef editiert. |