На этом шаге мы рассмотрим особенности использования стандартных операторов ввода-вывода при работе со строками .
Для строк определены традиционные операторы ввода-вывода:
Эти операторы работают со строковыми объектами практически так же, как с обычными С-строками. В частности, оператор >> выполняет следующие действия.
Отсюда следует, что в общем случае оператор ввода читает следующее слово, игнорируя начальные пропуски. Пропуском считается любой символ, для которого функция isspace(c,strm.getloc()) возвращает true (функция isspace() будет рассмотрена позднее).
Оператор вывода также учитывает ширину поля в потоке данных (это значение возвращает функция width()). Иначе говоря, если width()>0, то оператор << выводит, по меньшей мере, width() символов.
Потоковые классы также определяют в пространстве имен std специальную функцию для построчного чтения данных: std::getline(). Функция читает все символы (вместе с начальными пропусками) до тех пор, пока не обнаружит разделитель строк или конец файла. Разделитель строк извлекается из потока данных, но не присоединяется к прочитанным данным. По умолчанию разделителем строк является символ новой строки, однако вы можете передать собственный разделитель в необязательном аргументе.
Таким образом, оператор << может использоваться для чтения лексем, разделенных произвольными символами:
std::string s; while (getline(std::cin,s)) { // Для каждой строки, прочитанной из cin . . . . } while (getline(std::cin,s,':')) ( // Для каждой строки, прочитанной из cin . . . . }
Учтите, что в режиме чтения лексем символ новой строки не является специальным символом. То есть лексемы могут содержать внутренние символы новой строки.
На следующем шаге мы рассмотрим организацию поиска в строке.