double arrow

Функции get, getline и read


Следующий вариант 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 будет установлено равным "отказу". Таким образом, если мишень была не инициализирована, то она и останется не инициализированной.







Сейчас читают про: