Дополнительные возможности cin и cout в c++
Содержание:
Другие решения
Как правило, вы используете для нормального выхода, за ошибки и для «регистрации» (что может означать все, что вы хотите, чтобы это значило).
Основное отличие состоит в том, что не буферизуется, как два других.
По отношению к старому С а также , соответствует , в то время как а также оба соответствуют (Кроме этого буферизован).
96
Стандартный выходной поток (cout): это пример учебный класс. используется для вывода на стандартное устройство вывода, которым обычно является экран дисплея. Данные, которые необходимо отобразить на экране, вставляются в стандартный поток вывода () используя оператор вставки ().
Небуферизованный стандартный поток ошибок (cerr): стандартный поток ошибок, который используется для вывода ошибок. Это также пример учебный класс. Как является небуферизованный поэтому он используется, когда нам нужно немедленно отобразить сообщение об ошибке. У него нет буфера для хранения сообщения об ошибке и отображения позже.
Буферизированный стандартный поток ошибок (засорение): Это также пример класс и используется для отображения ошибок, но в отличие ошибка сначала вставляется в буфер и сохраняется в буфере, пока не будет заполнен полностью.
дальнейшее чтение : базовый ввод-вывод-с
6
Разница этих 3 потоков в буферизации.
- С cerr, выходные сбрасывает
- С засорением, выход сбрасывает
- после того, как вы закончите свою текущую функцию.
- явно вызвать функцию flush.
- С cout, вывод сбрасывает
- после вызова любых потоков вывода (cout, cerr, clog).
- после того, как вы закончите свою текущую функцию.
- явно вызвать функцию flush.
Пожалуйста, проверьте следующий код и запустите DEBUG через 3 строки: f (std :: clog), f (std :: cerr), f (std :: out), затем откройте 3 выходных файла, чтобы увидеть, что произошло. Вы можете поменять эти 3 строки, чтобы увидеть, что произойдет.
1
Из черновика стандартного документа C ++ 17:
Обсуждение …
пишет ; а также в
Стандартный выход () предназначен для получения не ошибочных, не диагностических выходных данных из программы, таких как выходные данные успешной обработки, которые могут быть отображены конечному пользователю или переданы на некоторый дополнительный этап обработки.
Стандартная ошибка () предназначен для диагностических выводов, таких как предупреждения и сообщения об ошибках, которые указывают, что программа не произвела или не выдала вывод, который мог ожидать пользователь. Этот ввод может отображаться конечному пользователю, даже если выходные данные передаются на дальнейшую стадию обработки.
а также привязаны к
Они оба флеш перед обработкой операций ввода-вывода сами. Это гарантирует отправку подсказок видны перед блоками программы для чтения ввода и что раньше выводили на очищается перед записью ошибки через , который хранит сообщения в хронологическом порядке их генерации, когда оба направлены в один и тот же терминал / файл / и т. д.
Это контрастирует с — если вы напишите там, он не будет буферизован и ни к чему не привязан, поэтому он будет буферизовать приличное количество журналов перед сбросом. Это дает наивысшую пропускную способность сообщений, но означает, что сообщения могут быть не быстро видны потенциальному потребителю, читающему терминал или следящему за журналом.
1
И то и другое соиЬ а также загромождать буферизованы но сегг небуферизован, и все это предопределенные объекты, которые являются экземплярами класса ostream.
Основное использование этих трех соиЬ используется для стандартного ввода, тогда как загромождать а также сегг используется для отображения ошибок.
Суть почему сегг небуферизован, может быть потому, что у вас есть несколько выходов в буфере, и в коде упоминается исключение ошибки, тогда вам нужно немедленно отобразить эту ошибку, что может быть сделано сегг эффективно.
Пожалуйста, поправьте меня, если я ошибаюсь.
cout обычно используется для отображения некоторых операторов на экране пользователя.
экс-
:
соиЬ<<«Арлена Батада»;
выход:
Арлин Батада
-2
Другие решения
Вы думаете об этом неправильно. Вы мыслите логическими шагами каждый раз или же используется. Ex. Сначала спросите номер, затем спросите имя. Это неправильный способ думать о , Таким образом, вы попадаете в состояние гонки, потому что вы предполагаете, что поток очищается каждый раз, когда вы запрашиваете ввод.
Если вы напишите свою программу исключительно для ввода, вы найдете проблему:
Выше вы думаете: «сначала получите номер». Итак, вы вводите нажмите ввод, и ваш вывод будет , Это почему? Это потому, что в потоке у вас есть и разбирается в переменная время все еще в потоке. Чтение документа для функция по умолчанию будет выглядеть в до встречается. В этом примере, так как находится в потоке, похоже, что он «пропустил» его, но он работал правильно.
Чтобы вышеперечисленное сработало, вам нужно будет ввести который будет правильно выводить , Что, или вы положили между а также так что это будет разбито на логические шаги, которые вы ожидаете.
Вот почему вам нужно команда. Потому что вы думаете об этом в логических шагах, а не в форме потока, поэтому вы попадаете в состояние гонки.
Возьмите другой пример кода, который обычно встречается в школах:
Выше, кажется, в логических шагах. Сначала спросите имя, фамилию, а затем возраст. Так что если вы сделали введите, затем введите, затем введите, приложение работает каждый логический шаг. Если вы думаете об этом в «потоках», вы можете просто ввести на вопрос «Имя:», и он будет работать так же, как и пропустить оставшиеся вопросы. Чтобы вышеперечисленное работало логическими шагами, вам необходимо оставшийся поток для каждого логического перерыва в вопросах.
Просто не забывайте думать о вводе вашей программы как о том, что она читает из «потока», а не логически. Каждый раз, когда вы звоните это читается из потока. Это создает довольно ошибочное приложение, если пользователь вводит неправильные данные. Например, если вы ввели символ, где ожидается, что приложение выдаст довольно (на первый взгляд) причудливый вывод.
7
Функция игнорирования используется для пропуска (отбрасывания / отбрасывания) символов во входном потоке. Игнорировать файл связан с файлом istream.
Рассмотрим функцию ниже
например: cin.ignore (120, ‘/ n’);
конкретная функция пропускает следующие 120 вводимых символов или пропускает символы, пока символ новой строки не будет прочитан.
1
Лучше использовать scanf («% », str) в c ++, чем cin.ignore () после оператора cin >>. Для этого сначала нужно включить < cstdio> header.
-2
Особенности считывания строк
Считывание строк при помощи cin >> s, где s — объект класса string или C-строка приведет к считыванию строки из непробельных символов, при этом пробельные символы пропускаются.Использовать манипулятор noskipws при чтении строк не следует.
Строку целиком до конца строки, вместе с пробельными символами можно считать следующим образом:
getline(cin, s);
Отметим следующую особенность такого считывания. Пусть входные данные заданы так — сначала число строк n, затем — n строк, возможно, содержащие пробелы. Требуется считать данные строки и сохранить их в массиве строк.
Правильное решение будет таким:
int n;string s, A;cin >> n;getline(cin, s);for (int i = 0; i < n; ++i) getline(cin, A);
Здесь нужно обратить внимание на «лишний» вызов getline после считывания числа n. Дело в том, что cin >> n не считывает конец строки из потока, поэтому последующий вызов getline вернет пустую строку (но зато считает конец строки), поэтому нужно сделать один «холостой» вызов getline перед считыванием всех остальных строк
Задача
В некоторой древней стране жили-были братья. Сколько их было, нам точно не известно, но в исторических источниках упоминается, что их точно было не менее трех. С течением времени у них появились дети и разбрелись они по миру, причем как и их родители, каждый построил свой город. Опять же с течением времени количество родственников начало стремительно возрастать и решили они между некоторыми городами построить дороги, а некоторые из них, уже до этого успели построить и объездные дороги вокруг своего города. В рукописях упоминается, что количество городов в той стране не превышало $8000$. Кроме того, в тех же рукописях содержались схематические карты, которые показывали наличие дорог между городами, или объездной дороги вокруг города. Карты имели вид квадратных матриц, в которых цифра $1$ указывала на наличие дороги между городами, или вокруг города, или $0$ в случае отсутствия таковой.
Изучите древние рукописи и дайте ответ на вопрос: а сколько же дорог было построено между городами?
Входные данные
В первой строке задано количество городов $n$, а в последующих $n$ строках через пробел задано по $n$ чисел, которые указывают на наличие или отсутствие соответствующей дороги.
Цикл do while
Цикл очень похож на цикл . Единственное их различие в том, что при выполнении цикла один проход цикла будет выполнен независимо от условия. Решение задачи на поиск суммы чисел от 1 до 1000, с применением цикла .
Принципиального отличия нет, но если присвоить переменной значение,
большее, чем 1000, то цикл все равно выполнит хотя бы один проход.
Попрактикуйтесь, поэкспериментируйте над собственными примерами задач. Циклы — очень важная вещь, поэтому им стоит уделить побольше внимания. Когда поймете, как работают циклы — можете смело переходить к изучению следующего урока.
Следующий урок — Массивы в C++ →.
Другие возможности
- imbue() — переопределение этой функции позволяет работать с различными локалями для преобразования читаемых и записываемых символов.
- setbuf() — позволяет использовать пользовательский буфер, вместо встроенного. По-умолчанию эта функция ничего не делает, но вы можете добавить в своей реализации такую возможность.
- showmanyc() — позволяет сообщить использующей функции, сколько символов еще можно прочесть из потока до блокировки. По-умолчанию возвращает 0 (т.е. нет информации о количестве символов).
- xsgetn() и xsputn() — пара методов для чтения/записи цельных блоков данных, по функциональности схожи с и . Если вдруг для блочного чтения или записи в вашем случае можно реализовать более эффективный алгоритм, чем посимвольная обработка, то эти методы для вас.
ЧТО ВНУТРИ iostream.h
Каждая написанная вами на C++ программа включала заголовочный файл iostream.h. Этот файл содержит определения, позволяющие вашим программам использовать cout для выполнения вывода и cin для выполнения ввода. Более точно, этот файл определяет классы istream и ostream (входной поток и выходной поток), a cin и соut являются переменными (объектами) этих классов. Выберите время, чтобы напечатать файл iostream.h. Он находится в подкаталоге INCLUDE. Определения в этом файле достаточно сложны. Однако если вы пройдете по файлу медленно, то обнаружите, что большинство определений являются просто определениями классов и констант. Внутри файла вы найдете объявления переменных cin и cout.
Особенности считывания символов
Пусть дано время в формате HH:MM. Считать его можно следующим образом:
int h, m;char c;cin >> h >> c >> m;
То есть сначала считывается число, затем — символ, затем — число.
При этом при считывании символа пропускаются пробельные символы (пробелы и концы строк) и считывается следующий непробельный символ. Например, если при запуске приведенного выше кода ввести «12 34», то переменная h станет равна 12, переменная с — ‘3’, а переменная m — 4.
Если установить манипулятор noskipws:
cin >> noskipws;
то при считывании символов пробельные символы не будут пропускаться. Для восстановления режима пропуска пробельных символов используется манипулятор skipws:
cin >> noskipws;
Обсуждение …
пишет ; а также в
Стандартный выход () предназначен для получения не ошибочных, не диагностических выходных данных из программы, таких как выходные данные успешной обработки, которые могут быть отображены конечному пользователю или переданы на некоторый дополнительный этап обработки.
Стандартная ошибка () предназначен для диагностических выводов, таких как предупреждения и сообщения об ошибках, которые указывают, что программа не произвела или не выдала вывод, который мог ожидать пользователь. Этот ввод может отображаться конечному пользователю, даже если выходные данные передаются на дальнейшую стадию обработки.
а также привязаны к
Они оба флеш перед обработкой операций ввода-вывода сами. Это гарантирует отправку подсказок видны перед блоками программы для чтения ввода и что раньше выводили на очищается перед записью ошибки через , который хранит сообщения в хронологическом порядке их генерации, когда оба направлены в один и тот же терминал / файл / и т. д.
Это контрастирует с — если вы напишите там, он не будет буферизован и ни к чему не привязан, поэтому он будет буферизовать приличное количество журналов перед сбросом. Это дает наивысшую пропускную способность сообщений, но означает, что сообщения могут быть не быстро видны потенциальному потребителю, читающему терминал или следящему за журналом.
1
Ввод информации
cin >> идентификатор;
При этом из входного потока читается последовательность символов до пробела, затем эта последовательность преобразуется к типу идентификатора, и получаемое значение помещается в идентификатор:
int n;cin >> n;
cin >> переменная1 >> переменная2 >>…>> переменнаяn;\n, \t
int n;char j;cin >> n >> j;
cinПример
12345678910
#include <iostream>using namespace std;int main(){ char s; cin >> s; cout << s << endl; system(«pause»); return 0;}
getline()
12345678910
#include <iostream>using namespace std;int main(){ char s; cin.getline(s, 80); cout << s << endl; system(«pause»); return 0;}

Цикл while
Когда мы не знаем, сколько итераций должен произвести цикл, нам понадобится цикл while или do…while. Синтаксис цикла while в C++ выглядит следующим образом.
Данный цикл будет выполняться, пока условие, указанное в круглых скобках
является истиной. Решим ту же задачу с помощью цикла while. Хотя здесь мы точно знаем, сколько итераций должен выполнить цикл, очень часто бывают ситуации, когда это значение неизвестно.
Ниже приведен исходный код программы, считающей сумму всех целых чисел от 1 до 1000.
После компиляции программа выдаст результат, аналогичный результату работы предыдущей программы. Но поясним несколько важных моментов. Я задал строгое неравенство в условии цикла и инициализировал счетчик i нулем, так как в цикле while происходит на одну итерацию больше, потому он будет выполняться, до тех пор, пока значение счетчика перестает удовлетворять условию, но данная итерация все равно выполнится. Если бы мы поставили нестрогое неравенство, то цикл бы закончился, когда переменная i стала бы равна 1001 и выполнилось бы на одну итерацию больше.
Теперь давайте рассмотрим по порядку исходный код нашей программы. Сначала мы инициализируем счетчик цикла и переменную, хранящую сумму чисел.
В данном случае мы обязательно должны присвоить счетчику цикла какое-либо значение, т.к. в предыдущей программе мы это значение присваивали внутри цикла for, здесь же, если мы не инициализируем счетчик цикла, то в него попадет «мусор» и компилятор в лучшем случае выдаст нам ошибку, а в худшем, если программа соберется — сегфолт практически неизбежен.
Затем мы описываем условие цикла — «пока переменная i меньше 1000 — выполняй цикл». При каждой итерации цикла значение переменной-счетчика увеличивается на единицу внутри цикла.
Когда выполнится 1000 итераций цикла, счетчик станет равным 999 и следующая итерация уже не выполнится, поскольку 1000 не меньше 1000. Выражение является укороченной записью .
После окончания выполнения цикла, выводим сообщение с ответом.
Решение
В приведенном выше коде этот бит …
…проверяет оставшуюся часть строки ввода после того, как число содержит только пробел.
Почему бы просто не использовать игнорировать?
Это довольно многословно, поэтому с помощью в потоке после это часто рекомендуемый альтернативный способ отбросить контент до следующей новой строки, но при этом он рискует выбросить непробельный контент и при этом пропустить поврежденные данные в файле
Вы можете или не можете заботиться, в зависимости от того, является ли содержимое файла надежным, насколько важно избежать обработки поврежденных данных и т. Д
Так когда бы вы использовали clear и ignore?
Так, (а также ) не обязательно для этого, но полезно для устранения состояния ошибки. Например, если вы хотите дать пользователю много шансов для ввода правильного номера.
Разве это не может быть проще с skipws или подобным?
Еще одна простая, но недоделанная альтернатива для вашего первоначального требования использует пропустить любое количество пробелов перед чтением строк …
…но если он получит ввод, такой как «1E6» (например, какой-то ученый пытается ввести 1 000 000, но C ++ поддерживает только эти обозначения для чисел с плавающей запятой), не примет это, вы в конечном итоге получите установлен в , а также читать как первое значение , Отдельно, если у вас есть правильный номер, за которым следуют одна или несколько пустых строк, эти строки будут игнорироваться.
9
Другие решения
16
Пытаться:
В качестве альтернативы. Если вы знаете, что номер и имена всегда будут в разных строках.
9
Вы можете использовать std :: ws для извлечения любых пробельных символов во входном буфере перед использованием getline. Заголовок для std :: ws является sstream.
5
Или вы можете очистить входной буфер, чтобы прочитать строку
это определено в заголовке stdio.h.
Этот код работает ..
1
это довольно самоочевидно, в потоке осталось \ n использует, который присваивается именам при первом использовании. Повторное использование getline пишет правильное значение сейчас.
1
Объект std::cin
std::cin является противоположностью std::cout. В то время как std::cout выводит данные в консоль с помощью оператора вывода , std::cin получает данные от пользователя с помощью оператора ввода . Используя std::cin мы можем получать и обрабатывать пользовательский ввод:
#include <iostream>
int main()
{
std::cout << «Enter a number: «; // просим пользователя ввести любое число
int a = 0;
std::cin >> a; // получаем пользовательское число и сохраняем его в переменную a
std::cout << «You entered » << a << std::endl;
return 0;
}
|
1 |
#include <iostream> intmain() { std::cout<<«Enter a number: «;// просим пользователя ввести любое число inta=; std::cin>>a;// получаем пользовательское число и сохраняем его в переменную a std::cout<<«You entered «<<a<<std::endl; return; } |
Попробуйте скомпилировать и запустить эту программу. При запуске вы увидите , а затем программа будет ждать, пока вы укажите число. Как только вы это сделаете и нажмете Enter, программа выведет , а затем ваше число.
Например (я ввел ):
Это самый простой способ получения данных от пользователя. Мы будем его использовать в дальнейших примерах.
Если ваше окно закрывается сразу после ввода числа — смотрите Урок №7 (там есть решение данной проблемы).
Если же ввести действительно большое число, то вы получите переполнение, так как переменная может содержать числа только определенного размера/диапазона. Если число больше/меньше допустимых максимумов/минимумов, то происходит переполнение. Об этом мы детально поговорим на следующих уроках.
Стандартный входной поток (cin)
Предопределенный объект cin является экземпляром класса istream . Говорят, что объект cin прикреплен к стандартным устройствам ввода, которые обычно являются клавиатурой. CIN используется в сочетании с оператором экстракции потока, который записывается как >> , которые являются два больше , чем знаки , как показано в следующем примере.
Когда вышеуказанный код скомпилирован и выполнен, он предложит вам ввести имя. Вы вводите значение, а затем нажмите Enter, чтобы увидеть следующий результат —
Компилятор C ++ также определяет тип данных введенного значения и выбирает соответствующий оператор извлечения потока для извлечения значения и сохранения его в данных переменных.
Оператор извлечения потока >> может использоваться более одного раза в одном выражении. Чтобы запросить более одного элемента данных, вы можете использовать следующее:
Это будет эквивалентно следующим двум утверждениям:
Манипуляторы потока
Функцию — манипулятор потока можно включать в операции помещения в поток и извлечения из потока (<<, >>).
В С++ имеется ряд манипуляторов. Рассмотрим основные:
| Манипулятор | Описание |
| endl | Помещение в выходной поток символа конца строки ‘\n’ |
| dec | Установка основания 10-ой системы счисления |
| oct | Установка основания 8-ой системы счисления |
| hex | Установка основания 16-ой системы счисления |
| setbase | Вывод базовой системы счисления |
| width(ширина) | Устанавливает ширину поля вывода |
| fill(‘символ’) | Заполняет пустые знакоместа значением символа |
| precision(точность) | Устанавливает количество значащих цифр в числе (или после запятой) в зависимости от использования fixed |
| fixed | Показывает, что установленная точность относится к количеству знаков после запятой |
| showpos | Показывает знак + для положительных чисел |
| scientific | Выводит число в экспоненциальной форме |
| get() | Ожидает ввода символа |
| getline(указатель, количество) | Ожидает ввода строки символов. Максимальное количество символов ограничено полем количество |
Пример Программа ввода-вывода значения переменной в C++
1234567891011
#include <iostream>using namespace std;int main(){ int n; cout << «Введите n:»; cin >> n; cout << «Значение n равно: » << n << endl; cin.get(); cin.get(); return 0;}
12345678910
#include <stdio.h>int main(){ int n; printf(«Введите n:»); scanf(«%d», &n); printf(«Значение n равно: %d\n», n); getchar(); getchar(); return 0;}
Пример
1234567891011121314151617181920212223242526
#include <iostream>using namespace std;int main(){ double a = -112.234; double b = 4.3981; int c = 18; cout << endl << «double number:» << endl; cout << «width(10)» << endl; cout.width(10); cout << a << endl << b << endl; cout << «fill(‘0’)» << endl; cout.fill(‘0’); cout.width(10); cout << a << endl << b << endl; cout.precision(5); cout << «precision(5)» << endl << a << endl << b << endl; cout << «fixed» << endl << fixed << a << endl << b << endl; cout << «showpos» << endl << showpos << a << endl << b << endl; cout << «scientific» << endl << scientific << a << endl << b << endl; cout << endl << «int number:» << endl; cout << showbase << hex << c << » » << showbase << oct << c << » «; cout << showbase << dec << c << endl; cin.get(); return 0;}
12345678910111213141516
#include <iostream>using namespace std;int main(){ cout << fixed; for (double t = 0; t <= 3; t += 0.5) { cout.width(3); cout.precision(1); cout << t; cout.width(8); cout.precision(3); cout << cos(t) << endl; } system(«pause»); return 0;}
Язык C++
Стандартный выходной поток (cout)
Предопределенный объект cout является экземпляром класса ostream . Сообщается, что объект cout «подключен к» стандартным устройствам вывода, который обычно является экраном дисплея. СоиЬ используется в сочетании с оператором вставки потока, который записывается в виде << которые являются два меньше , чем знаки , как показано в следующем примере.
Когда приведенный выше код компилируется и выполняется, он производит следующий результат:
Компилятор C ++ также определяет тип данных переменной, подлежащей выводу, и выбирает соответствующий оператор вставки потока для отображения значения. Оператор << перегружен для вывода элементов данных встроенных типов и значений указателя.
Оператор ввода может использоваться более одного раза в одном выражении, как показано выше, и используется для добавления новой строки в конце строки.
Вывод действительных чисел
Есть два способа вывода действительных чисел — с фиксированной точкой (соответствует форматной строке «%f» функции printf) и с плавающий точкой (соответствует «%e»). Для переключения режима вывода действительных чисел в формат с фиксированной точкой используется манипулятор fixed, для вывода с плавающей точкой — манипулятор scientific.
По умолчанию числа выводятся с точностью в 6 знаков после точки, это значение можно изменить при помощи манипулятора setprecision с параметром — шириной поля вывода.
Например:
cout << scientific << setprecision(15) << x << endl;
Данные манипуляторы после включения действуют постоянно, до следующего задания значения, то есть их не нужно задавать перед выводом каждой переменной.
По умолчанию (если не задать явно манипулятор fixed или scientific) число может выводиться или с плавающей точкой, или с фиксированной, в зависимости от величины числа. Если был установлен один из манипуляторов fixed или scientific, то вернуть «автоматический» выбор формы представления числа можно при помощи манипулятора
cout << resetiosflags(ios_base::floatfield);
Традиционный ввод-вывод
Для использования традиционного ввода-вывода в духе C, в программу необходимо включить заголовочный файл . (Разумеется, компилятор должен иметь доступ к соответствующей объектной библиотеке для правильной сборки исполняемого файла.)
Библиотека stdio предоставляет необходимый набор функций для ввода и вывода информации как в текстовом, так и в двоичном представлении. Следует отметить, что в отличие от классической C‑библиотеки, в современных библиотеках имеются более безопасные аналоги «классических» функций. Как правило, они имеют такое же имя, к которому добавлен суффикс _s. Рекомендуется использовать именно эти, безопасные функции.
Самая Первая Программа с использованием библиотеки stdio выглядит так:
При запуске консольного приложения неявно открываются три потока: stdin — для ввода с клавиатуры, stdout — для буферизованного вывода на монитор и stderr — для небуферизованного вывода на монитор сообщений об ошибках. Эти три символа определены посредством .
В stdio для консольного ввода-вывода предусмотрена отдельная группа функций. Однако эти функции, как правило, являются обёртками для аналогичных функций файлового ввода-вывода, для которых аргумент типа FILE задан по умолчанию.
Самая Первая Программа с использование файлового вывода из библиотеки stdio выглядит так:
Некоторые популярные функции из stdio:
Сущность FILE представляет собой структуру, в которой хранится вся информация для управления потоком ввода-вывода.
Файл открывается функцией fopen(), которой передаются два параметра. Первый параметр определяет имя файла. Второй — определяет режим открытия файла: чтение, запись, произвольный доступ и т.п., а также указание на то, как работать с данными: в текстовом или двоичном режиме. Подробности — см. в документации.
Ввод-вывод с помощью потоков STL
Для использования объектно-ориентированного консольного ввода-вывода с помощью потоков (stream) STL в программу необходимо включить заголовочный файл , а для файлового ещё и . (Разумеется, компилятор должен иметь доступ к соответствующей объектной библиотеке для правильной сборки исполняемого файла.)
Самая Первая Программа с использованием потоков STL выглядит так:
При запуске консольного приложения неявно открываются четыре потока: сin — для ввода с клавиатуры, сout — для буферизованного вывода на монитор, сerr — для небуферизованного вывода на монитор сообщений об ошибках и clog — буферизованный аналог cerr. Эти четыре символа определены посредством .
Потоки cin, cout и cerr соответствуют потокам stdin, stdout и stderr соответственно.
Иерархия классов ввода-вывода STL достаточно сложна. Любители тонких ощущений могут найти её описание в литературе. Впрочем, остальных также не минует чаша сия, но только позже, когда потребуются знания чуть повыше того базового уровня, который описывается здесь.
Для ввода-вывода сначала необходимо создать поток — экземпляр соответствующего класса STL, а затем связать его с файлом. Для потока вывода используется класс ofstream, для потока ввода — ifstream, для потока ввода-вывода — fstream. В каждом из этих классов есть метод open(), который связывает поток с файлом. Проще говоря, открывает файл. Методу передаются два параметра: имя файла и режим открытия файла. Второй параметр представляет собой набор битовых флагов, определяющих режим открытия файла (чтение, запись и пр.) и способ работы с данными (текстовый или двоичный режим). Второй параметр опционален, т.е. имеет значение по умолчанию, соответствующее классу.
Вышеупомянутые классы имеют также конструкторы, позволяющие открыть файл сразу при создании потока. Параметры этих конструкторов полностью совпадают с параметрами метода open().
При ошибке открытия файла (в контексте логического выражения) поток получает значение false.
Файл закрывается методом close(). Этот метод также вызывается при разрушении экземпляров классов потоков.
Операции чтения и записи в поток, связанный с файлом, осуществляются либо с помощью операторов << и >>, перегруженных для классов потоков ввода-вывода, либо с помощью любых других методов классов потоков ввода-вывода.
Некоторые наиболее употребляемые методы: