Перейти к содержимому

Ostream c что это

  • автор:

Потоки и система ввода-вывода

Все инструменты для работы с системой ввода-вывода и потоками в языке С++ определены в стандартной библиотеке. Заголовочный файл iostream определяет следующие базовые типы для работы с потоками:

  • istream и wistream : читают данные с потока
  • ostream и wostream : записывают данные в поток
  • iostream и wiostream : читают и записывают данные в поток

Для каждого типа определен его двойник, который начинается на букву w и который предназначен для поддержки данных типа wchar_t.

Эти типы являются базовыми для других классов, управляющих потоками ввода-вывода.

Объект типа ostream получает значения различных типов, преобразует их в последовательность символов и передает их через буфер в определенное место для вывода (консоль, файл, сетевые интерфейсы и т.д.)

Поток вывода ostream в С++

Поток istream получает через буфер из определенного места последовательности символов (с консоли, из файла, из сети и т.д.) и преобразует эти последовательности в значения различных типов. То есть когда мы вводим данные (с той же клавиатуры в консоли), сначала данные накапливаются в буфере и только затем передаются объекту istream.

Поток ввода istream в С++

По умолчанию в стандартной библиотеке определены объекты этих классов — cout , cin , cerr , которые работают с консолью.

Запись в поток

К примеру, по умолчанию стандартная библиотека C++ предоставляет объект cout , который представляет тип ostream и позволяет выводить данные на консоль:

#include int main()

std::cout 

Чтение данных

Для чтения данных из потока применяется оператор ввода >> , который принимает два операнда. Левый операнд представляет поток istream, с которого производится считывание, а правый операнд - объект, в который считываются данные.

Для чтения с консоли применяется объект cin , который представляет тип istream.

#include int main() < int age; double weight; std::cout > age; std::cout > weight; std::cout

Однако такой способ не очень подходит для чтения строк с консоли особенно когда считываемая строка содержит пробельные символы. В этом случае лучше использовать встроенную функцию getline() , которая в качестве параметра принимает поток istream и переменную типа string, в которую надо считать данные:

#include int main() < std::string name; std::cout > name; std::cout

Пример работы программы:

Input name: Tom Smit Your name: Tom Smit

По умолчанию признаком окончания ввода служит перевод на другую строку, например, с помощью клавиши Enter. Но также можно задать свой признак окончания ввода с помощью дополнительного параметра функции getline() . Для этого надо передать символ, который будет служить окончанием ввода:

#include int main() < std::string text; std::cout << "Input text: " << std::endl; getline(std::cin, text, '*'); // окончанием ввода будет служить символ * std::cout

В данном случае ввод завершится, когда пользователь введет символ *. Таким образом, мы можем ввести многострочный текст, но при вводе звездочки ввод завершится. Пример работы программы:

Input text: Hello World Good bye world* Your text: Hello World Good bye world

Вывод ошибок

Для вывода сообщения об ошибке на консоль применяется объект cerr , который представляет объект типа ostream:

#include int main()

Потоки символов wchar_t

Для работы с потоками данных типов wchar_t в стандартной библиотеке определены объекты wcout (тип wostream), wcerr (тип wostream) и wcin (тип wistream), которые являются аналогами для объектов cout, cerr и cin и работают аналогично

#include int main() < int age; double weight; std::wcout > age; std::wcout > weight; if (age

Ostream - зачем нужен?

Извините, подскажите пожалуйста, что такое ostream?
Не могу понять, зачем он нужен, хотя бы простой пример с какой целью он применяется, я конечно абстрактно понимаю, что для записи в поток, но что это в данном случае значит и чем к примеру ostream отличается от ofstream, что то так и не понял.

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

friend ostream &operator<<(ostream &stream, MyClass o);
Что означает данная строчка которую обычно пишут в конце класса? friend ostream.

Зачем нужен extern?
Знаю, что в интернете полно объяснений зачем он, но я не могу понять. Везде пишут, что он.

5993 / 3375 / 1374
Регистрация: 07.02.2019
Сообщений: 8,530

это базовый класс(не самый базовый конечно), ссылку на базовый класс можно инициализировать потомком:

1 2 3 4 5 6 7 8 9 10 11
void foo(std::ostream& os) { os  'text'; } //. std::ofstream ofs; std::ostringstream oss; //. foo(std::cout); // в консоль foo(ofs); // в файл foo(oss); // в строковый поток

134 / 47 / 5
Регистрация: 10.01.2017
Сообщений: 1,782
Большое спасибо! Эти примеры вроде бы понятны.
Но, я не могу понять, как работает вот этот код:

1 2 3 4
boost::asio::streambuf request; ostream request_stream1(&request); request_stream  "Какая то запись";

То есть в случае с Вашим примером выше, можно сделать так:

1 2 3
std::ostringstream oss; oss"Добавить запись"endl; coutoss.str()endl;

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

1 2 3
boost::asio::streambuf request; request"Дабавить запись"endl;

Почему нужно это делать через

ostream request_stream(&request);

, каков его физический смысл так сказать ?

Почему я тогда не могу сделать так же по аналогии:

1 2 3 4
std::ostringstream oss; ostream F(&oss); // отсутсвуют экземпляры конструктора соответсвующие типу аргументов F"добавить запись"endl;

5993 / 3375 / 1374
Регистрация: 07.02.2019
Сообщений: 8,530

ЦитатаСообщение от Optimus11 Посмотреть сообщение

boost::asio::streambuf request;
Optimus11, тут есть отдельный раздел по Boost, спросите там.

ЦитатаСообщение от Optimus11 Посмотреть сообщение

Почему я тогда не могу сделать так же по аналогии:
у std::ostream нет такого конструктора

1 2 3 4
std::ostringstream oss; std::ostream& F(oss); // так можно F  "добавить запись"  std::endl;

18413 / 9584 / 2341
Регистрация: 30.01.2014
Сообщений: 16,742

ЦитатаСообщение от Optimus11 Посмотреть сообщение

Почему я тогда не могу сделать так же по аналогии

Потому что std::ostringstream не наследнки basic_streambuf, в отличие от boost::asio::streambuf.

Конструктор от basic_streambuf описан в справке: https://en.cppreference.com/w/. ic_ostream

ЦитатаСообщение от Optimus11 Посмотреть сообщение

каков его физический смысл так сказать ?

Физический смысл простой. Создает объект потока, который связывается с кастомным буфером потока из boost::asio.

Добавлено через 1 минуту

ЦитатаСообщение от Optimus11 Посмотреть сообщение

почему нельзя просто сделать также:

Потому что буферу нужен объект потока, чтобы работать так, как ты показал. Такой дизайн.

Добавлено через 2 минуты
Идея в том, чтобы написать один раз класс потока. А затем связывать его с разными буферами для получения разного поведения: буфер консоли, файловый буфер, можно сделать буфер в компорт или сетевой сокет, как в asio.
Повторное использование кода, полиморфизм, все дела.

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Зачем нужен const?
Добрый вечер, разбираюсь с классом стек, подскажите пожалуйста, для чего здесь нужен const? .

Объяснить зачем нужен i
#include <iostream> #include <conio.h> using namespace std; int main() < cout <<.

Зачем нужен конструктор?
Всем доброго дня. Ребят такая проблема объясните мне на пальцах для чего нужен конструктор в.

Зачем нужен inline
Скажите пожалуйста, зачем нужна команда inline? Изучаю классы, и там говорится мимолётом, что эта.

ostream::operator

Для классов большинство операторов вида X ■ Y (включая

  • В виде методов (функций-членов класса): struct A < … operator■(…)>;
  • В виде свободных (обычных) функций: struct A <>; int operator■(…, …)

Когда вы пишете X.operator■(Y) , компилятор учитывает только те перегрузки ■ , которые сделаны в виде методов.

Когда вы пишете operator■(X, Y) , компилятор учитывает только те перегрузки, которые сделаны в виде свободных функций.

Когда вы пишете X ■ Y , компилятор учитывает оба варианта перегрузок.

Для const char * (печать строки) он перегружен как свободная функция, а для const void * (печать адреса) он перегружен как метод.

Отслеживать
ответ дан 2 янв 2019 в 12:12
HolyBlackCat HolyBlackCat
26.4k 3 3 золотых знака 27 27 серебряных знаков 39 39 бронзовых знаков

ты тоже правильно ответил,один вопрос остался:ГДЕ ТЫ ВСЁ ЭТО У ЗНАЛ ТЫ ЧТО ДЕКСТЕР КАКОЙ-ТО Я НЕ ПОНИМАЮ ГДЕ ВЫ ВСЕ ТАКИЕ ЗНАНИЯ БЕРЕТЕ может книжка какая-то?

2 янв 2019 в 12:37
2 янв 2019 в 13:02

В определении самого класса для указательных типов имеется только перегрузка для параметра типа void *

template> class basic_ostream : virtual public basic_ios < public: . basic_ostream& operator<<(const void* p); . >; 
cout.operator 

вызывается именно функция-член класса, а других подходящих вариантов перегрузки нет: "Hello" - массив char[6] , который может быть неявно преобразован в char const * , который в свою очередь преобразуется в void const * поэтому и выводится адрес, в соответствии с поведением данной перегрузки.

Перегрузки, принимающие char const * объявлены как внешние функции:

template basic_ostream& operator<<(basic_ostream&, const char*); template basic_ostream& operator<<(basic_ostream&, const char*); 
operator<<(cout, "Hello"); 

Библиотека iostream. Основные операции

библиотека iostream, класс cin, класс cout, методы класса cout, методы класса cin, boolalpha, scientific, write, getline, get

Модуль (или как говорят в случае с Си – хедер) или заголовочный файл iostream призван предоставить средства ввода-вывода, для стандартной консоли. Т.е. то, что вводит с клавиатуры и читает с экрана пользователь.

Все его возможности размещены в пространстве имен std , поэтому для его использования либо приходится приписывать префикс std , либо указывать пространство имен через using namespace

using namespace std ;
cin >> Переменная ;
cout << "Чет там" ; std :: cin >> Переменная ;
std :: cout << "Чет там" ;

В этой статье будем использовать первый вариант – подключение пространства имен через using namespace .

iostream содержит два основных класса:

  • cin – для обработки ввода с клавиатуры;
  • cout – для вывода в консоль переменных или просто текста;

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

Сразу скажу, что не всё, что присуще этим классам будет описано. Только самое часто используемое из функционала. Это операторы перенаправления форматированного вывода ( и >> ), которые занимаются выводом значений переменных в зависимости от их типов и указанного формата. Это операторы неформатированного чтения\записи (читай: по байтам или посимвольно), методы get() , put() и write() призванные просто вывести массив символов какими бы они ни были. И операторы форматирования setf() , width() , precision() , которые указывают для текущего вывода, как форматировать выводимое, как выравнивать его, по какой стороне и сколько ставить символов после запятой.

Класс cin

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

библиотека iostream, класс cin, класс cout, cin.get

Как сказано выше, для начинающих программистов, мы рассмотрим только некоторые из них.

Класс cin основан на классе istream , и содержит возможность перенаправления ввода. Используя перегрузку оператора >> , класс позволяет указать в какую переменную будет производиться ввод данных.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *