Обрабатываем входной поток

Создадим простой проект, который сможет обработать входной поток данных и вывести что-то в ответ.

И так, пишем:

mkdir cp033
cd $_

создадим там файлик main.cpp и напишем в него

#include <iostream>
using namespace std;

int main(int argc, char* argv[]) { 
        string line;
        while (true) {
                getline(cin, line); // считываем введенную строку
                if (line == "") // если строка пустая, то выходим из цикла
                        break;
                cout << line << endl; // иначе пишем считанную строку в ответ
        }
        return 0;
}

это так называемое echo приложение, мы пишем что-то, и оно в ответ нам пишет тоже самое.

Давайте скомпилируем его

g++ main.cpp -o main

и запустим:

В принципе все до боли банально.

Но намного интереснее становится, когда вы используете такое приложение вместе с каким-то другим приложением которое может генерировать поток данных.

Оператор потока: |

Например, есть утилита seq которая позволяет генерить последовательности чисел, работает примерно так:

так вот, мы можем использовать результат генерации этой утилиты как входной поток данных для другой утилиты. Для этого используется так называемый stream-оператор |

Ну, то есть, мы как будто подменяем человека который пишет числа, утилитой которая пишет числа. С точки зрения программы которая эти числа принимает – ей все равно.

Работает это так. Вы пишите сначала команду которая генерирует поток данных, а затем команду которая обрабатывает поток:

тут не очень наглядно, давайте сделаем чтобы наша программа выводила квадраты чисел.

Правим:

#include <iostream>
using namespace std;

int main(int argc, char* argv[]) { 
        string line;
        while (true) {
                getline(cin, line);
                if (line == "") 
                        break;
                        
                int a = atoi(line.c_str()); // преобразуем строку в число
                cout << a * a << endl; // а тут будем теперь выводить квадраты
        }
        return 0;
}

запускаем

вроде работает.

А теперь пусть значение генерит seq

красота! =) Кстати, заметьте, что входные значение не видны, видны только преобразованные.

Вообще, оператор можно использовать несколько раз:

У нас тут уже получается возведение в четвертую степень. То есть мы передаем результат нашей программы своей же программе

Утилита cowsay

Еще в linux есть прикольная абсолютно бесполезная утилита, которая позволяет вывести результат работы функции как мысли коровы. Называется она cowsay. Устанавливается вот так

sudo apt install cowsay

зато потом вы можете делать так

вообще там не только корову можно использовать можно дракона с коровой

полный список зверей можно получить через cowsay -l который кстати тоже можно передать в качестве текста самой команду cowsay

выглядит прикольно плюс так как эта утилита работает с входным потоком то она вполне подойдет под нашу задачу.

Задание

Написать программу, которая сможет обработать данные из предыдущего задания используя оператор потока в соответствии с заданием.

Используя второй оператор потока передать результат работы функции утилите cowsay