Шаг 377.
Библиотека STL.
Строки. Операторы ввода-вывода

    На этом шаге мы рассмотрим особенности использования стандартных операторов ввода-вывода при работе со строками .

    Для строк определены традиционные операторы ввода-вывода:

    Эти операторы работают со строковыми объектами практически так же, как с обычными С-строками. В частности, оператор >> выполняет следующие действия.

  1. Все начальные пропуски игнорируются, если флаг skipws не установлен.
  2. Оператор читает все последующие символы, пока не будет выполнено одно из следующих условий:
    • следующий символ является пропуском;
    • поток данных переходит в состояние, не позволяющее продолжать чтение (например, при достижении конца файла);
    • текущая ширина поля в потоке данных положительна, и из потока были прочитаны width() символов;
    • прочитаны max_size() символов.
  3. Ширина поля в потоке данных устанавливается равной нулю.

    Отсюда следует, что в общем случае оператор ввода читает следующее слово, игнорируя начальные пропуски. Пропуском считается любой символ, для которого функция isspace(c,strm.getloc()) возвращает true (функция isspace() будет рассмотрена позднее).

    Оператор вывода также учитывает ширину поля в потоке данных (это значение возвращает функция width()). Иначе говоря, если width()>0, то оператор << выводит, по меньшей мере, width() символов.

    Потоковые классы также определяют в пространстве имен std специальную функцию для построчного чтения данных: std::getline(). Функция читает все символы (вместе с начальными пропусками) до тех пор, пока не обнаружит разделитель строк или конец файла. Разделитель строк извлекается из потока данных, но не присоединяется к прочитанным данным. По умолчанию разделителем строк является символ новой строки, однако вы можете передать собственный разделитель в необязательном аргументе.


   Замечание. Функцию getline() не обязательно снабжать префиксом std::, поскольку при вызове функции по "правилу Кенига" поиск автоматически начнется с того пространства имен, в котором определен класс аргумента.

    Таким образом, оператор << может использоваться для чтения лексем, разделенных произвольными символами:

std::string s;
while (getline(std::cin,s)) {       // Для каждой строки, прочитанной из cin
  .   .   .   .
}
while (getline(std::cin,s,':')) (   // Для каждой строки, прочитанной из cin
  .   .   .   .
}

    Учтите, что в режиме чтения лексем символ новой строки не является специальным символом. То есть лексемы могут содержать внутренние символы новой строки.

    На следующем шаге мы рассмотрим организацию поиска в строке.




Предыдущий шаг Содержание Следующий шаг