    Чтение символьных строк 

    Вы уже видели, как библиотека потоков ввода-вывода может выводить 
символьные строки. Например, следующее объявление присваивает указателю на 
строку адрес строки символов 
    char *s = "Gently down the iostream"; 

Оператор 

    cout « s; 

отправит данную строку по назначению — в системный стандартный поток 
вывода, обычно на дисплей. Для чтения строки обратите процесс и используйте 
идентификатор потока ввода cm и оператор » (поместить в) 

    char buffer[128];         // Объявление буфера строки 
    cin » buffer;	    // ??? 

    Эти строки сработают, но, если пользователь введет более 127 символов, 
оператор ввода продолжит запись за пределами буфера, при этом, возможно, 
данные и код, располагающиеся за буфером, будут уничтожены. Такая операция 
может привести к краху системы. 
    К счастью, существует более безопасный способ ввести строку, как это 
показано в листинге 12.5. Скомпилируйте и запустите эту программу, затем 
введите строку длиной более 24 символов. При этом она будет благополучно 
усечена до длины буфера, объявленного в строке 5. 

    Листинг 12.5.  GETSTR.CPP (использование потоковой библиотеки для 
безопасного чтения строк) 

    1:	#include <iostream.h> 
    2: 
    3:	main() 
    4:	{ 
    5:	  char s[25]; 
    6:	  char c; 
    7: 
    8: 	  cout « "Enter a 24-char string safely: \n"; 
    9:	  cin.get(s, 25, '\n'); 
    10:	  cout « "You entered:	" « s « An'; 
    11:	  if (cin.get(c) && с != \n') 
    12:	    cout « "Maximum line length reached\n"; 
    13:	  return(); 
    14:	}
  
    В строке 9 демонстрируется безопасный способ чтения строк с помощью 
оператора библиотеки потоков ввода-вывода. Функция-член cin.get() вызывается 
с тремя аргументами. 

    •   Адрес   результирующего   символьного   массива.   Строка-результат   
будет   прочитана   в   этот   массив   и завершена нулевым символом. 
    •   Размер массива в байтах. 
    •   Символ, завершающий ввод. Если не указан, по умолчанию он равен '\п'. 

    До тех пор пока вы корректно задаете размер буфера результата, чтение 
ввода, приведенное в строке 9, безопасно. Одна проблема все же остается. 
Символ новой строки или другой символ, завершающий ввод, остается в потоке и 
должен быть прочитан еще одним оператором cin.get(), как это показано в строках 
11—12. Если cin.get() не читает символ новой строки, ввод будет усечен. Этот 
факт необходимо учитывать при написании программ. 
    Проблему непрочитанного символа новой строки можно решить по-другому: с 
помощью вызова функции-члена cin.getline(). Для чтения 24-символьной строки в 
25-байтовый буфер (один байт резервируется для нулевого символа — признака 
конца строки) следует использовать операторы: 

    char buffer[25]; 
    cin.getline(buffer, 25); 


    Запись данных 

    В целом, вы можете использовать данные любого типа в операторе вывода в 
поток. Для переменной v, независимо от ее типа, выражение 

    cout « v; 

    выведет нечто осмысленное, в системный стандартный поток вывода. Результат 
вывода данных некоторых типов может оказаться не совсем таким, каким вы его 
ожидали, и лучше не пытаться выводить подобным образом структуры и массивы. 
Конечно, вы можете отобразить значение указателей. Если указатель объявлен как 
int *p (или как указатель другого типа), оператор 

    cout « р; 


    284	Часть III. Программирование на ANSI C++ 
