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

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

24.11.2015, 16:12. Просмотров 3773. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2015, 16:12
Ответы с готовыми решениями:

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

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

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

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

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

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

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

cin не переменная, в которую записывается. Это команда\функция, которая направляет в поток.
0
Kerry_Jr
Эксперт PHP
2211 / 2007 / 940
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
24.11.2015, 16:41 4
Цитата Сообщение от ilja123 Посмотреть сообщение
cin не переменная, в которую записывается. Это команда\функция, которая направляет в поток
не знаете - молчите. cin - это переменная типа istream, хранящая в себе объект потока ввода.
0
Renji
2179 / 1606 / 486
Регистрация: 05.06.2014
Сообщений: 4,662
24.11.2015, 16:42 5
Цитата Сообщение от Zigfrid Посмотреть сообщение
Не так давно уже прогаю на С++ и все НИКАК не могу понять, что такое потоки ввода, потоки вывода..!
На пальцах: get_word_from_console(word) - "прочитай мне слово с консоли".
istream_value>>word - "прочитай мне слово. Что значит, откуда? Роди, найди, укради, не колышит, но чтоб слово было!".

write_word_to_console(word) - "напиши слово в консоль".
ostream_value<<word - "на слово, положи куда ни будь... Что значит, куда? Да пофиг куда, хоть в окошко выбрасывай".
0
Evg
Эксперт CАвтор FAQ
19789 / 7429 / 560
Регистрация: 30.03.2009
Сообщений: 20,712
Записей в блоге: 30
24.11.2015, 16:44 6
Поток вывода - это программная абстракция. Вывод данных может быть разным: на экран, в файл, в устройство, в сетевое соединение и т.п. При этом хочется сделать так, чтобы работа со всеми видами вывода при реализации программы выглядела одинаково. Для этого придумали абстракцию "поток вывода". При формировании вывода ты оперируешь понятиями типа "в поток вывода, описанный переменной 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
Kerry_Jr
24.11.2015, 16:45
  #7

Не по теме:

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

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

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

Ой.!

Добавлено через 1 минуту
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
хранящая в себе объект потока ввода.
К сожалению, не отвечает на вопрос...(
0
Evg
Эксперт CАвтор FAQ
19789 / 7429 / 560
Регистрация: 30.03.2009
Сообщений: 20,712
Записей в блоге: 30
24.11.2015, 16:54 9
Цитата Сообщение от 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
Renji
2179 / 1606 / 486
Регистрация: 05.06.2014
Сообщений: 4,662
24.11.2015, 17:02 10
Цитата Сообщение от 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
19789 / 7429 / 560
Регистрация: 30.03.2009
Сообщений: 20,712
Записей в блоге: 30
24.11.2015, 17:10 11
Цитата Сообщение от Zigfrid Посмотреть сообщение
Поток ввода = ячейка памяти
Если непонимание вызывает именно это, то потоком ввода можно считать некоторую переменную N (ну или ячейку памяти, если тебе так понятнее), в которой каким-то способом закодирована информация о том, что из себя представляет этот поток: экран, файл "out.txt", принтер или что-то ещё. Далее когда ты пишешь "cout << x", то у тебя реально вызывается библиотечная функция, которая является оператором << для объекта типа ostream. Эта функция выковыривает из переменной N информацию и передаёт её в операционную систему, операционная система в свою очередь перенаправляет данные на экран (в консоль), в файл, на принтер или куда-то ещё в зависимости от того, с чем ассоциирован указанный поток вывода
0
Mr.X
Эксперт С++
3184 / 1711 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
24.11.2015, 17:13 12
Цитата Сообщение от 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
19789 / 7429 / 560
Регистрация: 30.03.2009
Сообщений: 20,712
Записей в блоге: 30
24.11.2015, 17:17 13
Цитата Сообщение от Mr.X Посмотреть сообщение
Поток - это объект, содержащий в своем буфере последовательность символов
Наличие программного буфера - это уже особенность реализации (скажем так, оптимизация). Реализацию потока можно сделать так, чтобы данные напрямую писались в экран/устройство/файл без каких бы то ни было программных буферов. Просто это будет работать менее эффективно
0
Mr.X
Эксперт С++
3184 / 1711 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
24.11.2015, 17:37 14
Цитата Сообщение от Evg Посмотреть сообщение
Наличие программного буфера - это уже особенность реализации (скажем так, оптимизация).
Ну, товарищ стандартными потоками ввода-вывода интересуется, а они именно таковы.
Про буфер я специально написал, чтобы было понятно, что это что-то реальное, а не мифическое, как представлялось автору.
0
Evg
Эксперт CАвтор FAQ
19789 / 7429 / 560
Регистрация: 30.03.2009
Сообщений: 20,712
Записей в блоге: 30
24.11.2015, 17:59 15
По-моему товарища просто вводит в заблуждение синтаксис вида "cout <<" и "cin >>" и ему кажется, что это какие-то промежуточные переменные, с которыми дальше непонятно что происходит. Может было бы правильнее объяснить, что записи

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

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

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

Точно так же понятие потока вывода абстрагирует конкретный программный код, занимающийся формированием полезных данных, от каких-то ненужных ему знаний типа того, а куда мы эти данные реально отправим
0
Zigfrid
11 / 11 / 1
Регистрация: 24.11.2015
Сообщений: 359
Завершенные тесты: 1
24.11.2015, 19:30  [ТС] 20
Цитата Сообщение от Evg Посмотреть сообщение
Ты этого не знаешь и тебе это жить не мешает.
Воистину "Ignorance is bliss!"
0
24.11.2015, 19:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2015, 19:30

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

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

Переделать потоки ввода-вывода на 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...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru