Я хочу быть в состоянии сделать это:Как читать содержимое конвейера в C?
$ echo "hello world" | ./my-c-program
piped input: >>hello world<<
Я знаю, что isatty
should be used, чтобы обнаружить, если STDIN является терминал или нет. Если это не tty, я хочу прочитать содержимое в конвейере - в приведенном выше примере это строка hello world
.
Какой рекомендуемый способ сделать это в C?
Вот что я получил до сих пор:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
if (!isatty(fileno(stdin))) {
int i = 0;
char pipe[65536];
while(-1 != (pipe[i++] = getchar()));
fprintf(stdout, "piped content: >>%s<<\n", pipe);
}
}
Я составил это с помощью:
gcc -o my-c-program my-c-program.c
Это почти работ, за исключением того, что всегда, кажется, добавить символ замены U + FFFD и newline (я все-таки понимаю новую строку) в конце строки содержимого. Почему это происходит, и как можно избежать этой проблемы?
echo "hello world" | ./my-c-program
piped content: >>hello world
�<<
Отказ от ответственности: У меня нет опыта работы с C вообще. Пожалуйста, успокойся.
Почему downvote? –
@ H2CO3 Почему вы удалили свой ответ? Это был единственный, кто объяснял, что происходит. Или это было неправильно? –