教育とプログラミングの実践のために、生のキーボード入力を処理し、「リアルタイム」で端末に出力できる単純なライブラリを作成したいと思います。
私は可能な限り ansi C を使い続けたいと思っています。私はいくつかの Google 検索を行いましたが、結果の 99% はライブラリを使用しているか、C++ 用です。
Windows で動作するようにしてから、時間があれば OSX に移植したいと思っています。
教育とプログラミングの実践のために、生のキーボード入力を処理し、「リアルタイム」で端末に出力できる単純なライブラリを作成したいと思います。
私は可能な限り ansi C を使い続けたいと思っています。私はいくつかの Google 検索を行いましたが、結果の 99% はライブラリを使用しているか、C++ 用です。
Windows で動作するようにしてから、時間があれば OSX に移植したいと思っています。
ANSI C を使用してオープン ストリームをバッファリングしないように設定するには、次のようにします。
#include <stdio.h>
if (setvbuf(fd, NULL, _IONBF, 0) == 0)
printf("Set stream to unbuffered mode\n");
(参考:C89 4.9.5.6)
ただし、その後は自己責任です。:-)
可能な限り標準 C に固執することは良い考えですが、標準 C だけを使用して採用したタスクを大幅に進めることはできません。端末から文字を 1 つずつ取得するメカニズムは、本質的にプラットフォーム固有です。POSIX システム (MacOS X) の場合は、<termios.h>
ヘッダーを見てください。古いシステムでは、さまざまなヘッダーとシステム コールを使用して、同様の効果を実現しています。'line kill' のようなものが行末に表示され、それまでに入力されたすべての文字をザッピングする可能性があることを思い出して、特殊文字の処理を行うかどうかを決定する必要があります。
Windows の場合は、WIN32 API を掘り下げる必要があります。少なくとも、「ターミナル」を文字単位モードにする場合、Unix と Windows の間のコードには本質的に共通点はありません。単一の文字を読み取るメカニズムがあれば、一般的なコードを管理できます (おそらく)。
また、文字と押されたキーの違いについても考慮する必要があります。たとえば、MacOS X で 'ï' を入力するには、and を入力option-uしiます。それは 3 つのキーを押すことです。
これは、標準の ISO C だけでは不可能です。ただし、次の方法を試すことができます。
#include <stdio.h>
void setbuf(FILE * restrict stream, char * restrict buf);
および関連する機能。
あなたの最善の策は、ncurses
ライブラリを使用することです。