2013-04-30 5 views
2

Я хочу быть в состоянии сделать это:Как читать содержимое конвейера в 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 вообще. Пожалуйста, успокойся.

+0

Почему downvote? –

+0

@ H2CO3 Почему вы удалили свой ответ? Это был единственный, кто объяснял, что происходит. Или это было неправильно? –

ответ

5

Символ замены появляется, потому что вы забыли NUL-завершить строку.

Новая линия есть, потому что по умолчанию echo вставляет '\n' в конце своего вывода.

Если вы хотите, чтобы не вставить '\n' использовать это:

echo -n "test" | ./my-c-program 

И, чтобы удалить неверный символ вставки

pipe[i-1] = '\0'; 

перед печатью текста.

Обратите внимание, что в качестве нулевого символа необходимо использовать i-1, так как вы выполнили свой цикл теста. В вас код i увеличивается еще раз после последнего символа.

+0

Как 'pipe [i-1] = '\ 0'', так и' pipe [i-1] = 0; ', похоже, работают. Спасибо! –