我写一个C ++(Windows)中的客户端的控制台应用程序,从标准输入上一个匿名管道读取。 我希望能够用我的程序如下:
echo input text here | my_app.exe
和做一些与在管道的文本应用程序
要么
my_app.exe
然后使用一些默认的文本应用程序,而不是从管道输入的内部。
我现在有代码,从给出的第一种情况的标准输入管道成功读取:
#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的将继续从标准输入缓冲区读取,直到它检测到写操作对管(的另一端的端perhapse读取某种“写的结束”令牌?)。 我想知道是否有某种“开始写”令牌,将在缓冲区,如果事情被管道中,我可以检查标准输入之前我打电话的ReadFile的。 如果是这样的话我可能就跳过调用ReadFile和使用一些默认的文本。
如果没有办法做到这一点,我可以随时通过在表示我不应该检查管道,只是使用默认的文本(或者反过来)命令行参数,但我更喜欢做我指定的方式。