Teste se stdin tem entrada para C ++ (windows e / ou linux)

Eu basicamente quero testar se stdin tem entrada (como se você ecoasse e canalizasse). Encontrei soluções que funcionam, mas são feias e gosto que minhas soluções sejam limpas.

No linux, eu uso isso:

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

Sei que devo adicionar mais tratamento de erros, mas não vem ao caso.

No Windows, eu uso isto:

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

Isso é bom para Linux, mas eu quero saber quais são as APIs equivalentes que posso chamar sem usar um pipe (como para test -f $ file você do fopen ($ file, "r")! = NULL ). Tenho a impressão de que poderia abrir ("/ dev / stdin", "r") e fazer a mesma coisa, mas quero saber a melhor maneira de fazer isso.

Resumo: Quero saber as APIs que posso usar para substituir test -p / dev / stdin para linux e, se você souber uma solução melhor para Windows.

13
задан Petros Koutsolampros 7 March 2014 в 23:52
поделиться