×
Traktatov.net » Язык программирования C++. Пятое издание » Читать онлайн
Страница 73 из 714 Настройки

Подобно операторам ввода и вывода встроенных типов, операторы строк возвращают как результат свой левый операнд. Таким образом, операторы чтения или записи можно объединять в цепочки.

>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() которого необходимо вызвать.