Подобно операторам ввода и вывода встроенных типов, операторы строк возвращают как результат свой левый операнд. Таким образом, операторы чтения или записи можно объединять в цепочки.
>string s1, s2;
>cin >> s1 >> s2; // сначала прочитать в переменную s1,
> // а затем в переменную s2
>cout << s1 << s2 << endl; // отобразить обе строки
Если в этой версии программы осуществить предыдущий ввод, >" Hello World! "
, выводом будет >"HelloWorld!"
.
В разделе 1.4.3 уже рассматривалась программа, читающая неопределенное количество значений типа >int
. Напишем подобную программу, но читающую строки.
>int main() {
> string word;
> while (cin >> word) // читать до конца файла
> cout << word << endl; // отобразить каждое слово с новой строки
> return 0;
>}
Здесь чтение осуществляется в переменную типа >string
, а не >int
. Условие оператора >while
, напротив, выполняется так же, как в предыдущей программе. Условие проверяет поток после завершения чтения. Если поток допустим, т.е. не встретился символ конца файла или недопустимое значение, выполняется тело цикла >while
. Оно выводит прочитанное значение на стандартное устройство вывода. Как только встречается конец файла (или недопустимый ввод), цикл >while
завершается.
>getline()
для чтения целой строкиИногда игнорировать пробелы во вводе не нужно. В таких случаях вместо оператора >>>
следует использовать функцию >getline()
. Функция >getline()
получает поток ввода и строку. Функция читает предоставленный поток до первого символа новой строки и сохраняет прочитанное, исключая символ новой строки, в своем аргументе типа >string
. Встретив символ новой строки, даже если это первый символ во вводе, функция >getline()
прекращает чтение и завершает работу. Если символ новой строки во вводе первый, то возвращается пустая строка.
Подобно оператору ввода, функция >getline()
возвращает свой аргумент типа >istream
. В результате функцию >getline()
можно использовать в условии, как и оператор ввода (см. раздел 1.4.3). Например, предыдущую программу, которая выводила по одному слову в строку, можно переписать так, чтобы она вместо этого выводила всю строку:
>int main() {
> string line;
> // читать строки до конца файла
> while (getline(cin, line))
> cout << line << endl;
> return 0;
>}
Поскольку переменная >line
не будет содержать символа новой строки, его придется вывести отдельно. Для этого, как обычно, используется манипулятор >endl
, который, кроме перевода строки, сбрасывает буфер вывода.
>getline()
, отбрасывается и в строковой переменной не сохраняется.>size()
и >empty()
Функция >empty()
(пусто) делает то, что и ожидается: она возвращает логическое значение >true
(раздел 2.1), если строка пуста, и значение >false
— в противном случае. Подобно функции-члену >isbn()
класса >Sales_item
(см. раздел 1.5.2), функция >empty()
является членом класса >string
. Для вызова этой функции используем точечный оператор, позволяющий указать объект, функцию >empty()
которого необходимо вызвать.