Следующий вариант get позволяет управлять числом извлекаемых символов, их размещением и оконечным символом:
istream& istream::get(char *buf, int max, int term[='\n']);
Эта функция считывает символы из входного потока в символьный массив buf до тех пор, пока не будет считано max символов, либо пока не встретится символ, заданный term, либо пока не встретится конец файла, в зависимости оттого, что произойдет раньше. Завершающий пустой символ добавляется автоматически. По умолчанию терминатором (который не обязательно задавать) является символ новой строки ('\n'). Сам терминатор в массив buf не считывается и из istream не удаляется. Массив buf должен иметь размер как минимум max символов.
Пример:
#include <iostream.h>
#define NUMCHAR 45
void main()
{ char name[NUMCHAR+1];
cout<<"Введите ваше имя и фамилию:\n";
cin.get(name,NUMCHAR);
cout<<"\nСпасибо,"<<name;
}
В функции cin.get() первый аргумент – имя переменной, принимающей данные; второй – максимальное число вводимых символов: третий (необязательный) – символ, служащий признаком окончания ввода (по умолчанию используется символ \n). Функция cin.get() считывает все символы в строке, включая пробелы и знаки табуляции, пока не будет прочитано указанное число символов или не встретится символ-ограничитель. Так, например, если в качестве ограничителя используется символ ’* ’, то необходимо записать оператор ввода следующим образом
|
|
cin.get(name,NUMCHAR,’*’);
Функция
istream& istream::getline(char *buf, int max, int term);
считывает символы из входного потока в символьный массив buf до тех пор, пока не будет считано max символов, либо пока не встретится символ, заданный term, либо пока не встретится конец файла, в зависимости оттого, что произойдет раньше. Завершающий пустой символ добавляется автоматически. По умолчанию терминатором (который не обязательно задавать) является символ новой строки ('\n'). В отличие от функции get функция getline терминатор в массив buf считывает и из istream удаляет.
Можно прочитать "сырые" двоичные данные с помощью функции read:
istream& istream::read(signed char* ptr, int n);
istream& istream::read(unsigned char* ptr, int n);
Пример:
cin.read ((char*)&x, sizeof(x));
Для типа char* (рассматриваемого как строка) действие операции >> состоит в пропуске пробельных символов и записи следующих (не пробельных) символов до тех пор, пока не встретится следующий пробельный символ. Затем добавляется завершающий нулевой (0) символ. Следует предъявлять осторожность и избегать "переполнения" строки. Ширина по умолчанию, равная нулю (означает, что предельное значение не задано), может быть изменена при помощи width (или setw) следующим образом:
char array[SIZE];
...
// инициализация массива
...
cin.width(sizeof(array));
cin >> array // позволяет избежать переполнения
В случае любого ввода встроенных типов, если конец ввода встретится ранее первого не пробельного символа, в мишень buf ничего записано не будет, а состояние istream будет установлено равным "отказу". Таким образом, если мишень была не инициализирована, то она и останется не инициализированной.