Использование других функций двоичного ввода-вывода Помимо приведенного выше формата использования функции get()
существуют и другие ее перегруженные версии. Приведем прототипы для трех из них, которые используются чаще всего.
istream &get(char *buf, streamsize num);
istream &get(char *buf, streamsize num, char delim);
int get();
Первая версия позволяет считывать символы в массив, заданный параметром buf
, до тех пор, пока либо не будет считано num-1 символов, либо не встретится символ новой строки, либо не будет достигнут конец файла. После выполнения функции get() массив, адресуемый параметром buf, будет иметь завершающий нуль-символ. Символ новой строки, если таковой обнаружится во входном потоке, не извлекается. Он остается там до тех пор, пока не выполнится следующая операция ввода-вывода.Вторая версия предназначена для считывания символов в массив, адресуемый параметром buf
, до тех пор, пока либо не будет считано num-1 символов, либо не обнаружится символ, заданный параметром delim, либо не будет достигнут конец файла. После выполнения функции get() массив, адресуемый параметром buf, будет иметь завершающий нуль-символ. Символ-разделитель (заданный параметром delim), если таковой обнаружится во входном потоке, не извлекается. Он остается там до тех пор, пока не выполнится следующая операция ввода-вывода.Третья перегруженная версия функции get()
возвращает из потока следующий символ. Он содержится в младшем байте значения, возвращаемого функцией. Следовательно, значение, возвращаемое функцией get(), можно присвоить переменной типа char. При достижении конца файла эта функция возвращает значение EOF, которое определено в заголовке .Функцию get()
полезно использовать для считывания строк, содержащих пробелы. Как вы знаете, если для считывания строки используется оператор ">>", процесс ввода останавливается при обнаружении первого же пробельного символа. Это делает оператор ">>" бесполезным для считывания строк, содержащих пробелы. Но эту проблему, как показано в следующей программе, можно обойти с помощью функции get(buf,num).
/* Использование функции get() для считывания строк содержащих пробелы.
*/
#include
#include
using namespace std;
int main()
{
char str[80];
cout << "Введите имя: ";
cin.get (str, 79);
cout << str << '\n';
return 0;
}
Здесь в качестве символа-разделителя при считывании строки с помощью функции get()
используется символ новой строки. Это делает поведение функции get() во многом сходным с поведением стандартной функции gets(). Однако преимущество функции get() состоит в том, что она позволяет предотвратить возможный выход за границы массива, который принимает вводимые пользователем символы, поскольку в программе задано максимальное количество считываемых символов. Это делает функцию get() гораздо безопаснее функции gets().Рассмотрим еще одну функцию, которая позволяет вводить данные. Речь идет о функции getline()
, которая является членом каждого потокового класса, предназначенного для ввода информации. Вот как выглядят прототипы версий этой функции,
istream &getline(char *buf, streamsize num);
istream &getline(char *buf, streamsize num, char delim);
Функция getline() представляет собой еще один способ ввода данных.
При использовании первой версии символы считываются в массив, адресуемый указателем buf
, до тех пор, пока либо не будет считано num-1 символов, либо не встретится символ новой строки, либо не будет достигнут конец файла. После выполнения функции getline() массив, адресуемый параметром buf, будет иметь завершающий нуль-символ. Символ новой строки, если таковой обнаружится во входном потоке, при этом извлекается, но не помещается в массив buf.Вторая версия предназначена для считывания символов в массив, адресуемый параметром buf
, до тех пор, пока либо не будет считано num-1 символов, либо не обнаружится символ, заданный параметром delim, либо не будет достигнут конец файла. После выполнения функции getline() массив, адресуемый параметром buf, будет иметь завершающий нуль-символ. Символ-разделитель (заданный параметром delim), если таковой обнаружится во входном потоке, извлекается, но не помещается в массив buf.