4

これは簡単だと思いますが、明らかに私には向いていません!

私はコンソールアプリケーションを持っています。キーボードからの入力を読み取る必要がありstdinますが、ファイルにリダイレクトされています。では、使用できるキーボードストリームを指すファイルハンドルを作成するにはどうすればよいfgetsですか?

ttyname(0)私がここに持っていないPOSIX環境で探しているもののように思われることがわかりました。私は、標準の Visual Studio コンパイラを備えた Windows システムを使用しています。

何か案は?前もって感謝します。

4

2 に答える 2

1

キーボードが存在するかどうかを判断する簡単でポータブルな方法はありません(アプリケーションは、シリアルポート、Telnetセッション、またはその他のものからターミナルエミュレーターから実行されている可能性があります)。キーボードが実際に存在する場合(タッチスクリーン上のキーボードの写真を含む)、キーストロークがアプリケーションに到達する前に通過する必要のあるソフトウェアのレイヤー数を実際に知ることはできません(たとえば、キーストロークはキーボードドライバーから入力メソッドエディター、GUI、シェル、アプリケーション)。これは、キーボードドライバなどから直接キーストロークを取得しようとすることは、ほとんどすべての場合に失敗する悪い考えであることを意味します。

問題を解決する最善の方法は、最初にSTDINがリダイレクトされる原因となった一連の設計上の失敗を見つけることです。

例えば; アプリケーションには、ファイルからデータを読み取るためのコマンドラインオプションが必要だったのかもしれません。これにより、アプリケーションはファイルから一部のデータを取得し、STDINから一部のデータを取得できます(コマンドラインオプションが存在しない場合は、STDINからすべてのデータを取得できます)。

于 2012-10-05T13:15:23.920 に答える
1

ここで、DOS プログラミングの暗黒時代から抜け出します。予約語である「CON:」(コンソール) を開いてみてください。うまくいけば、Windows でも同じ方法で開くことができます。コロンが必要な場合とそうでない場合があります。「dir >con:」と「dir >con」はどちらもコマンド プロンプトで機能します。

また、バッファリングを避けるために、出力ハンドルで setbuf() ファミリの何かを必ず使用してください...ターミナル I/O をバッファリングすることは想定されていませんが、確かに害はありません。

繰り返しますが、確かではありませんが、FILE *conin, *conout入力と出力の両方を行う 1 つのハンドルに問題がある場合は、出力用と入力用に別々に開くと役立つと思われます。

于 2012-10-05T10:14:07.467 に答える