В книжках пишут про стандартные потоки ввода-вывода в C++, запись в поток и чтение из потока.
Что такое поток, и что он из себя представляет?
Ответы
Ответ 1
Поток это просто абстракция. Удобная абстракция для решения задач.
Но если так будет легче - считайте, что это такая труба. С одной стороны в нее пихаютс
данные, а с другой куда то уходят (например, на консоль или в файл). Так как труба н
нулевого размера, часть данных там может "задерживаться" - это так называемая буферизация. Понимание этого может облегчить понимание некоторого странного поведения стандартных потоков.
Рассмотрим например, такое чтение с консоли:
int n;
std::string s;
std::cin >> n >> s;
и такие данные на вход:
123a aaa
Как это будет работать? Вначале стандартному потоку нужно прочитать число. Он буде
читать до тех пор, пока там число. В n попадет 123. В "трубе осталось "a aaa". Дальше нужно прочитать строку. А строка читается до пробела или перевода строки. Поэтому прочитается только одно a. А многие полагают, что прочитается три а.
Я привел этот пример не просто так. На него многие попадаются.
Как это реализовано внутри? Очень просто. Есть очередь (то есть, если очень груб
- массив), откуда читают данные байт за байтом. Если в очереди ничего нет - библиотечны
код обращается к функциям операционной системы и читает с консоли/файла/сокета) и складывает в очередь. Конечно, в некоторых случаях эта очередь может быть реализована на базе операционной системы, а может и явно. Но для пользователя (то есть программиста) это прозрачно.
Аналогично работает и вывод.
Чем удобны потоки?
После того, как поток "подключен" к файлу или консоли, дальше все идет одинаково
Можно, к примеру написать функции, которые будут выводить в поток, но при этом абсолютно не знать, куда именно они выводят. Это позволяет писать обобщенные алгоритмы и прочие вкусности.
Например, нужно сделать функцию форматированного вывода числа на консоль (со спец
пожеланиями). Можно конечно закодить вывод на std::cout, но как протестить? Можно написат
функцию, которая будет на вход получать ostream (предок std::cout) и выводить в него. Потом можно использовать такую функцию и выводить в stringstream, который легко преобразовывается в строку и результат можно выверить тестом.
Ответ 2
Поток (stream) — это абстракция, которая представляет устройство с операциями ввод
и вывода. Таким образом, поток можно понимать как источник и/или приёмник бесконечного количества символов.
Потоки обычно привязываются к физическому источнику/приёмнику символов, например
файлу, клавиатуре или консоли. При этом символы, читаемые из или записываемые в пото
действительно физически вводятся или выводятся на устройство. Например, файловые потоки в C++ являются объектами для манипуляций с файлами: после того, как файловый поток открывает файл, любая операция ввода/вывода на этом потоке физически отображается в файле.
Комментариев нет:
Отправить комментарий