Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/56: Рейтинг темы: голосов - 56, средняя оценка - 4.55
11 / 11 / 1
Регистрация: 24.11.2015
Сообщений: 359

Что такое потоки ввода, потоки вывода?

24.11.2015, 16:12. Показов 11956. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здарова всем!

Не так давно уже прогаю на С++ и все НИКАК не могу понять, что такое потоки ввода, потоки вывода..!

вот допустим есть код:
C++
1
2
3
4
5
6
7
8
std::cout << "Введите первое число: ";
std::cin >> a;
std::cout << "Введите знак: ";
std::cin >> sign;
std::cout << "Введите второе число: ";
std::cin >> b;
 
std::cout << a << sign << b << '=' << c << '\n';
Вот все до чего я смог допятиться своим скудным умишкой:
1) есть некие мифические потоки ввода и вывода
2) поток вывода связан с cout, поток ввода с cin
3) когда мы вводим какую информацию с клавы, то мы эту информацию записываем в поток cin. То бишь, в этом случаи cin как-бы выступает в качестве некой переменной, куда мы записываем введенную информацию
4) командой cout<< мы выводим информацию из потока cin.. То есть, выгружаем из как-бы переменной cin нужную нам информацию...


Правильно ли я понимаю или все вообще не так? А то даже выглядит то, что я написал как-то криво...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.11.2015, 16:12
Ответы с готовыми решениями:

Потоки ввода вывода
Почему с помощью классов ostream и istream нельзя создавать свои потоки ввода вывода? std::ostream output; output &lt;&lt;...

Потоки ввода/вывода
Здравствуйте! Расскажите мне пожалуйста подробнее о всех особенностях потоков ввода/вывода; в особенности почему, когда я заполняю...

Потоки ввода-вывода в С++
Ребят, нужна помощь В программирование я новичок, но сдать нужно 1. Написать программу, печатающую символы. Использовать цикл while....

20
6 / 7 / 2
Регистрация: 18.05.2015
Сообщений: 124
24.11.2015, 16:30
Смотри проще!
По сути поток - то, откуда ты вводишь-выводишь информацию: клавиатура, файл текстовый и т.п.
cin >> передает в хранение значение в ячейку памяти из потока.
cin >> a (в консольном окне вводишь например 5) , теперь в ячейке памяти сохраняется значение 5 (а=5)
cout << вывод потоковый на дисплей, файл текстовый опять же, передает в поток значение , которое хранится в ячейке памяти , cout << a; выдаст значение 5 на дисплей.
Написал очень неграмотно, но обычно чем хуже сказал, бывает более понятней)
0
48 / 48 / 6
Регистрация: 24.12.2009
Сообщений: 532
24.11.2015, 16:33
Философский вопрос прям

Ну допустим поток ввода\вывода может быть на экран, может в файл. По умолчанию весь поток вывода идет на экран. Вы можете изменить поток, например в файл. И ваше "cout << "text text text";" будет идти не на экран, а записываться в файл.

cin не переменная, в которую записывается. Это команда\функция, которая направляет в поток.
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
24.11.2015, 16:41
Цитата Сообщение от ilja123 Посмотреть сообщение
cin не переменная, в которую записывается. Это команда\функция, которая направляет в поток
не знаете - молчите. cin - это переменная типа istream, хранящая в себе объект потока ввода.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
24.11.2015, 16:42
Цитата Сообщение от Zigfrid Посмотреть сообщение
Не так давно уже прогаю на С++ и все НИКАК не могу понять, что такое потоки ввода, потоки вывода..!
На пальцах: get_word_from_console(word) - "прочитай мне слово с консоли".
istream_value>>word - "прочитай мне слово. Что значит, откуда? Роди, найди, укради, не колышит, но чтоб слово было!".

write_word_to_console(word) - "напиши слово в консоль".
ostream_value<<word - "на слово, положи куда ни будь... Что значит, куда? Да пофиг куда, хоть в окошко выбрасывай".
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
24.11.2015, 16:44
Поток вывода - это программная абстракция. Вывод данных может быть разным: на экран, в файл, в устройство, в сетевое соединение и т.п. При этом хочется сделать так, чтобы работа со всеми видами вывода при реализации программы выглядела одинаково. Для этого придумали абстракцию "поток вывода". При формировании вывода ты оперируешь понятиями типа "в поток вывода, описанный переменной N, напечатать текст". А перед этим выполняешь что-то типа "ассоциировать переменную N с выводом на экран" или "ассоциировать переменную N с выводом в файл". Т.е. все эти абстракции нужны для универсализации работы с разными устройствами ввода-вывода. std::cout условно можно рассматривать за заранее инициализированную переменную N, ассоциированную с выводом на экран.

C++
#include <iostream>
#include <fstream>
 
/* Наша функция просто делает печать в абстрактный поток out
 * Она не знает, чем на самом деле является out, экраном,
 * файлом, или чем-то ещё. Её задача - напечатать. А куда
 * напечатать - путь решают наверху (в точке вызова нашей
 * функции) */
void do_output (std::ostream &out)
{
  out << "trampampam\n";
}
 
int main (void)
{
  std::ofstream file ("out.txt");
 
  /* Печать на экран */
  do_output (std::cout);
 
  /* Печать в файл */
  do_output (file);
 
  return 0;
}
1
24.11.2015, 16:45

Не по теме:

Renji, объяснил, так объяснил! :D

0
11 / 11 / 1
Регистрация: 24.11.2015
Сообщений: 359
24.11.2015, 16:48  [ТС]
Ага, то есть, грубо говоря, это просто название такое страшшное всего лишь .
Поток ввода = ячейка памяти. То есть, я просто после того, как ввожу что-то с клавы, все это записывается в память, а грамотно и заумно это запись в поток ввода. А командой cin>> я делаю так, что то, что ввожу с клавы направляю в ячейки памяти компьютера, а могу например не в ячейки памяти, а в файл.
И с потоками вывода точно также. Командой cout<< я заставляю комп выводить то, что в его ячейке памяти на экран, а могу также в файл.
Все по сути?

Добавлено через 1 минуту
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
cin не переменная, в которую записывается. Это команда\функция, которая направляет в поток
не знаете - молчите. cin - это переменная типа istream, хранящая в себе объект потока ввода.

Ой.!

Добавлено через 1 минуту
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
хранящая в себе объект потока ввода.
К сожалению, не отвечает на вопрос...(
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
24.11.2015, 16:54
Цитата Сообщение от Zigfrid Посмотреть сообщение
Поток ввода = ячейка памяти. То есть, я просто после того, как ввожу что-то с клавы, все это записывается в память, а грамотно и заумно это запись в поток ввода. А командой cin>> я делаю так, что то, что ввожу с клавы направляю в ячейки памяти компьютера, а могу например не в ячейки памяти, а в файл.
И с потоками вывода точно также. Командой cout<< я заставляю комп выводить то, что в его ячейке памяти на экран, а могу также в файл.
Все по сути?
В старых языках программирования для ввода и вывода данных использовались встроенные я язык операторы языка. На бэйсике это было типа "PRINT X" - напечатать на экран значение переменой X, "INPUT X" - ввести с клавиатуры значение и записать его в переменную X. В языке Си отказались от встроенных операторов ввода-вывода и заменили их функциями. Т.е. printf ("%d", x) - напечатать на экран значение переменой x, scanf ("%d", &x) - ввести с клавиатуры значение и записать его в переменную x. В языке C++ всё это ещё более видоизменилось и вместо функций появились перегруженные операции << и >> над объектами типа "абстрактный поток ввода" и "абстрактный поток вывода". Но смысл остался точно таким же: "cout << x" - напечатать на экран значение переменой x, cin >> x - ввести с клавиатуры значение и записать его в переменную x.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
24.11.2015, 17:02
Цитата Сообщение от Zigfrid Посмотреть сообщение
Поток ввода = ячейка памяти.
Поток ввода = набор оберток вокруг функии "дай еще текста". Самой "ячейки" может вообще не существовать. Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<iostream>
struct zero_buf:std::streambuf
{
    zero_buf():pos(0){setg(0,0,0);}
    //возвращает текущий символ потока
    int underflow(){
        return pos&1?'0':' ';
    }
    //тоже самое, но еще продвигается вперед по потоку
    int uflow(){
        ++pos;
        return pos&1?' ':'0';
    }
 
    int pos;
};
 
int main()
{
    zero_buf buf;
    //поток с бесконечным количеством нулей
    std::istream stream(&buf);
    //попробуем прочитать сто значений:
    for(int i=0;i<100;++i)
    {
        int n;
        stream>>n;
        //одни нули, да? Но ведь строки на сто нулей нигде не хранится!
        std::cout<<n<<std::endl;
    }
    return 0;
}
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
24.11.2015, 17:10
Цитата Сообщение от Zigfrid Посмотреть сообщение
Поток ввода = ячейка памяти
Если непонимание вызывает именно это, то потоком ввода можно считать некоторую переменную N (ну или ячейку памяти, если тебе так понятнее), в которой каким-то способом закодирована информация о том, что из себя представляет этот поток: экран, файл "out.txt", принтер или что-то ещё. Далее когда ты пишешь "cout << x", то у тебя реально вызывается библиотечная функция, которая является оператором << для объекта типа ostream. Эта функция выковыривает из переменной N информацию и передаёт её в операционную систему, операционная система в свою очередь перенаправляет данные на экран (в консоль), в файл, на принтер или куда-то ещё в зависимости от того, с чем ассоциирован указанный поток вывода
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
24.11.2015, 17:13
Цитата Сообщение от Zigfrid Посмотреть сообщение
1) есть некие мифические потоки ввода и вывода
Поток - это объект, содержащий в своем буфере последовательность символов.
Цитата Сообщение от Zigfrid Посмотреть сообщение
2) поток вывода связан с cout, поток ввода с cin
cout - это объект потока вывода, связанный с монитором.
cin - это объект потока ввода, связанный с клавиатурой.
Цитата Сообщение от Zigfrid Посмотреть сообщение
3) когда мы вводим какую информацию с клавы, то мы эту информацию записываем в поток cin. То бишь, в этом случаи cin как-бы выступает в качестве некой переменной, куда мы записываем введенную информацию
Информация, набираемая на клавиатуре, записывается в буфер объекта cin.
Цитата Сообщение от Zigfrid Посмотреть сообщение
4) командой cout<< мы выводим информацию из потока cin.. То есть, выгружаем из как-бы переменной cin нужную нам информацию...
Оператор вывода << (он перегружен для всех используемых типов) выводит в буфер объекта cout набор символов, соответствующий значению некоторого типа, которое выводится в поток. Манипулятор endl выводит символы из буфера объекта cout на монитор.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
24.11.2015, 17:17
Цитата Сообщение от Mr.X Посмотреть сообщение
Поток - это объект, содержащий в своем буфере последовательность символов
Наличие программного буфера - это уже особенность реализации (скажем так, оптимизация). Реализацию потока можно сделать так, чтобы данные напрямую писались в экран/устройство/файл без каких бы то ни было программных буферов. Просто это будет работать менее эффективно
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
24.11.2015, 17:37
Цитата Сообщение от Evg Посмотреть сообщение
Наличие программного буфера - это уже особенность реализации (скажем так, оптимизация).
Ну, товарищ стандартными потоками ввода-вывода интересуется, а они именно таковы.
Про буфер я специально написал, чтобы было понятно, что это что-то реальное, а не мифическое, как представлялось автору.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
24.11.2015, 17:59
По-моему товарища просто вводит в заблуждение синтаксис вида "cout <<" и "cin >>" и ему кажется, что это какие-то промежуточные переменные, с которыми дальше непонятно что происходит. Может было бы правильнее объяснить, что записи

C++
cout << "text";
cin >> var;
это всего лишь синтаксическая особенность языка Си++, которая по смыслу эквивалентна чему-то типа

C
operator_left_shift (cout, "text");
operator_righ_shift (cin, &var);
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
24.11.2015, 18:27
А если копнуть с другой стороны?
Zigfrid, что такое файл, знаешь?
А что такое чтение из файла, запись в файл?
0
11 / 11 / 1
Регистрация: 24.11.2015
Сообщений: 359
24.11.2015, 18:37  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
По-моему товарища просто вводит в заблуждение синтаксис вида "cout <<" и "cin >>" и ему кажется, что это какие-то промежуточные переменные, с которыми дальше непонятно что происходит. Может было бы правильнее объяснить, что записи
Цитата Сообщение от Байт Посмотреть сообщение
Zigfrid, что такое файл, знаешь?
А что такое чтение из файла, запись в файл?
Товарищ знает) Чтение и запись - тоже.
Просто смущает терминология.. "Потоки ввода, вывода".
Я вот понимаю, записать значение в переменную, считать значение из переменной, понимаю, что значит считать из файла и записать в файл - кучу раз так делал. Но потоки???
Именно сам термин и вводит в ступор.

Но я так понял, что это просто действительно некая абстракция
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
24.11.2015, 18:48
Цитата Сообщение от Zigfrid Посмотреть сообщение
Но я так понял, что это просто действительно некая абстракция
Да-да, абстракция, реализованная в виде класса стандартной библиотеки. Поток содержит информацию в виде последовательности "сырых" символов. Вывод значения в поток - это запись в него набора символов, соответствующих значению выводимого типа, ввод значения из потока - это ввод из него группы символов и формирование из них значения вводимого типа.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
24.11.2015, 18:57
Цитата Сообщение от Zigfrid Посмотреть сообщение
понимаю, что значит считать из файла и записать в файл - кучу раз так делал. Но потоки???
Файл - это тоже абстракция. Которая абстрагирует тебя от конкретных секторов, дорожек и прочих особенностей устройства диска. Просто с понятием файла ты работаешь более-менее постоянно, а потому тебе кажется понятно, что это такое. Абстракция тебя спасает от конкретного понимания, как хранятся данные на диске. Ты этого не знаешь и тебе это жить не мешает.

Точно так же понятие потока вывода абстрагирует конкретный программный код, занимающийся формированием полезных данных, от каких-то ненужных ему знаний типа того, а куда мы эти данные реально отправим
0
11 / 11 / 1
Регистрация: 24.11.2015
Сообщений: 359
24.11.2015, 19:30  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Ты этого не знаешь и тебе это жить не мешает.
Воистину "Ignorance is bliss!"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.11.2015, 19:30
Помогаю со студенческими работами здесь

Потоки ввода-вывода
1) Типы данных, для которых перегружены операторы форматного ввода-вывода.

Используя потоки ввода/вывода в С++
Здравствуйте помогите организовать запись информации из массива объектов в класс, чтение данной информации из класса, ввод информации с...

Текстовые файлы и потоки ввода/вывода
Доброго времени суток. Уважаемый гуру, не могли бы вы мне помочь с решением данной программы. Алгоритм знаю, но никак не могу его...

Непонятная ошибка. Потоки ввода/вывода
Решал задачу и столкнулся с проблемой (первый день на c++ &quot;пишу&quot;) не пойму что за ошибка #include &quot;stdafx.h&quot; #include...

Переделать потоки ввода-вывода на prinf и scanf
#include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; int x,y,i,j,n1,m1,n2,m2,z; void cret(void) { cout&lt;&lt;&quot;\nVvedit...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru