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()
которого необходимо вызвать.
А теперь пересмотрим предыдущую программу так, чтобы она выводила только непустые строки:
//
while (getline(cin, line))
if (!line.empty())
cout << line << endl;
Условие использует !
). Он возвращает инверсное значение своего операнда типа bool
. В данном случае условие истинно, если строка line
не пуста.
Функция size()
возвращает длину строки (т.е. количество символов в ней). Давайте используем ее для вывода строк длиной только больше 80 символов.
string line;
//
while (getline(cin, line))
if (line.size() > 80)
cout << line << endl;
string::size_type
Вполне логично ожидать, что функция size()
возвращает значение типа int
, а учитывая сказанное в разделе 2.1.1, вероятней всего, типа unsigned
. Но вместо этого функция size()
возвращает значение типа string::size_type
. Этот тип требует более подробных объяснений.
В классе string
(и нескольких других библиотечных типах) определены вспомогательные типы данных. Эти вспомогательные типы позволяют использовать библиотечные типы машинно-независимым способом. Тип size_type
— это один из таких вспомогательных типов. Чтобы воспользоваться типом size_type
, определенным в классе string
, применяется оператор области видимости (оператор ::
), указывающий на то, что имя size_type
определено в классе string
.
Хотя точный размер типа string::size_type
неизвестен, можно с уверенностью сказать, что этот беззнаковый тип (см. раздел 2.1.1) достаточно большой, чтобы содержать размер любой строки. Любая переменная, используемая для хранения результата операции size()
класса string
, должна иметь тип string::size_type
.
string::size_type
. По новому стандарту можно попросить компилятор самостоятельно применить соответствующий тип при помощи спецификаторов auto
или decltype
(см. раздел 2.5.2):