STDINの無名パイプから読み取るC++(Windows)クライアントコンソールアプリケーションを作成しています。私のプログラムを次のように使用できるようにしたいと思います。
echo input text here | my_app.exe
パイプで送られるテキストを使ってアプリで何かをします
また
my_app.exe
次に、パイプからの入力の代わりに、アプリ内でデフォルトのテキストを使用します。
私は現在、最初の状況でSTDINのパイプから正常に読み取るコードを持っています。
#include <Windows.h>
#include <iostream>
#include <string>
#define BUFSIZE 4096
int main(int argc, const char *argv[]) {
char char_buffer[BUFSIZE];
DWORD bytes_read;
HANDLE stdin_handle;
BOOL continue_reading;
unsigned int required_size;
bool read_successful = true;
stdin_handle = GetStdHandle(STD_INPUT_HANDLE);
if (stdin_handle == INVALID_HANDLE_VALUE) {
std::cout << "Error: invalid handle value!\n\n";
} else {
continue_reading = true;
while (continue_reading) {
continue_reading = ReadFile(stdin_handle, char_buffer, BUFSIZE,
&bytes_read, NULL);
if (continue_reading) {
if (bytes_read != 0) {
// Output what we have read so far
for (unsigned int i = 0; i < bytes_read; i++) {
std::cout << char_buffer[i];
}
} else {
continue_reading = false;
}
}
}
}
return 0;
}
私は、匿名パイプを使用する唯一のオプションは、ReadFileを使用してブロッキング読み取りを行うことであることを知っています。私が正しく理解していれば、それを呼び出す方法に関して、ReadFileは、パイプのもう一方の端で書き込み操作の終了を検出するまで(おそらく、ある種の「書き込みの終了」を読み取るまで)、STDINのバッファーから読み取りを続けます。トークン??)。ReadFileを呼び出す前に、STDINをチェックできる何かがパイプされている場合に、バッファーにある種の「書き込み開始」トークンがあるかどうかを知りたいです。この場合、ReadFileの呼び出しをスキップして、デフォルトのテキストを使用できます。
これを行う方法がない場合は、パイプをチェックせずにデフォルトのテキストを使用する(またはその逆)ことを示すコマンドライン引数をいつでも渡すことができますが、それを行う方がはるかに望ましいです私が指定した方法。