программа А «фильтр» просто программа, которая считывает данные из стандартного потока ввода (stdin
) и записывается в стандартный выходной поток (stdout
). Перед записью прочитанных данных данные обычно каким-то образом преобразуются (если вы не преформируете какое-либо преобразование или фильтрацию, вы в основном написали программу cat
, которая просто распечатывает все, что ей дано). Сила программы фильтрации исходит из того факта, что они не определяют, откуда их вход или откуда идет выход. Вместо этого для вызывающего абонента программы требуется канал ввода/вывода.
Ядро программы фильтра может выглядеть примерно так (вы можете использовать это в качестве шаблона для ваших собственных программ-фильтров):
#include <stdio.h>
int filter(FILE *input, FILE *output);
int main(void)
{
const int retval = filter(stdin, stdout);
fflush(stdout);
return retval;
}
Вот и все. Фактическая работа выполняется с помощью функции filter
, которая выполняет желаемое преобразование.Например, вот простая программа, которая считывает символы из входного файла, превращает их в нижний регистр, а затем выводит их в выходной файл:
#include <stdio.h>
#include <ctype.h> /* for tolower */
int filter(FILE *input, FILE *output)
{
while (!feof(input)) {
if (ferror(input)) {
return 1;
}
fputc(tolower(fgetc(input)), output);
}
return 0;
}
int main(void)
{
const int retval = filter(stdin, stdout);
fflush(stdout);
return retval;
}
Если скомпилировать и запустить эту программу, она будет просто сидеть там и терпеливо ждут чтения данных из стандартного входного файла stdin
. Этот файл обычно связан с консолью, что означает, что вам нужно вводить некоторые данные вручную. Однако командные оболочки реализуют функцию, называемую pipe, которая позволяет вам вывести вывод одной команды на вход другого. Это позволяет составлять несколько программ в pipeline для создания мощных команд.
Вот как мы могли бы использовать нашу программу фильтра (предполагая, что вы назвали Образовавшийся двоичной lower
):
$ echo Hello | lower
hello
$
Поскольку наша программа фильтра не определяет, где данные для чтения приходит от, мы можем объединить он со всеми видами программ, производящих выход на stdout
. Например, вот как вы можете получить весь файл как строчными (вы можете использовать type
на машинах Windows, вместо):
$ cat myfile.txt
Hello, World!
This is a simple test.
$ cat myfile.txt | lower
hello, world!
this is a simple test.
$
я упускаю что-то? 1 апреля было пару дней назад ... –
Для всех инструментов, о которых вы упомянули, вы можете легко найти исходный код. Почему бы вам не взглянуть на это, чтобы узнать, как они реализованы? –
@ Майкл, нет, это пришло, когда я отвечал на другой вопрос, и я понял, что нет никаких сомнений в этом. В соответствии с рекомендациями (SO предназначен для всех уровней пользователей и ответа на ваши собственные вопросы), я думал, что я его выдумал. Очевидно, _I_ знаю, как это сделать, но я не буду ревничать, вместо этого разрешу кому-то ответить (если только они не будут в кучу дня, в этом случае я буду ревновать до максимума :-) – paxdiablo