Проверьте, есть ли в stdin вход для C ++ (windows и / или linux) - PullRequest
13 голосов
/ 27 июля 2011

Я в основном хочу проверить, есть ли ввод в stdin (например, если вы выводите эхо и передаете его).Я нашел решения, которые работают, но они уродливы, и мне нравятся мои решения, чтобы быть чистыми.

В Linux я использую это:

bool StdinOpen() {
  FILE* handle = popen("test -p /dev/stdin", "r");
  return pclose(handle) == 0;
}

Я знаю, что я должен добавить больше ошибокобработки, но это не имеет значения.

В Windows я использую это:

bool StdinOpen() {
  static HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
  DWORD bytes_left;
  PeekNamedPipe(handle, NULL, 0, NULL, &bytes_left, NULL);
  return bytes_left;
}

Это нормально для Linux, но я хочу знать, какие эквивалентные API-интерфейсы я могу вызвать безиспользуя трубу (как для test -f $file вы делаете fopen($file, "r") != NULL).У меня есть подозрение, что я могу open("/dev/stdin", "r") и сделать то же самое, но я хочу знать, как лучше всего это сделать.

Резюме: Я хочу знать API, которые я мог быиспользуйте для замены test -p /dev/stdin на linux, и, если вы знаете лучшее решение для windows.

Ответы [ 3 ]

14 голосов
/ 27 июля 2011

Вот решение для POSIX (Linux): я не уверен, что эквивалентно poll () в Windows. В Unix дескриптор файла с номером 0 является стандартным вводом.

#include <stdio.h>
#include <sys/poll.h>

int main(void)
{
        struct pollfd fds;
        int ret;
        fds.fd = 0; /* this is STDIN */
        fds.events = POLLIN;
        ret = poll(&fds, 1, 0);
        if(ret == 1)
                printf("Yep\n");
        else if(ret == 0)
                printf("No\n");
        else
                printf("Error\n");
        return 0;
}

Тестирование:

$ ./stdin
No
$ echo "foo" | ./stdin
Yep
1 голос
/ 22 марта 2016

Это не сработает?

std::cin.rdbuf()->in_avail();
1 голос
/ 27 июля 2011

Я не уверен, но _kbhit() делает то, что вам нужно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...