Выбрать главу
Чтение и запись строк

Как уже упоминалось в главе 1, для чтения и записи значений встроенных типов, таких как int, double и т.д., используется библиотека iostream. Для чтения и записи строк используются те же операторы ввода и вывода.

// Обратите внимание: перед компиляцией этот код следует дополнить

// директивами #include и объявлениями using

int main() {

 string s;          // пустая строка

 cin >> s;          // чтение разделяемой пробелами строки в s

 cout << s << endl; // запись s в поток вывода

 return 0;

}

Программа начинается с определения пустой строки по имени s. Следующая строка читает данные со стандартного устройства ввода и сохраняет их в переменной s. Оператор ввода строк читает и отбрасывает все предваряющие непечатаемые символы (например, пробелы, символы новой строки и табуляции). Затем он читает значащие символы, пока не встретится следующий непечатаемый символ.

Таким образом, если ввести " Hello World! " (обратите внимание на предваряющие и завершающие пробелы), фактически будет получено значение "Hello" без пробелов.

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

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() прекращает чтение и завершает работу. Если символ новой строки во вводе первый, то возвращается пустая строка.