Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Дополнительные сведения о функциях двоичного ввода/вывода



Кроме представленной ранее формы, функция get() перегружается несколькими различными способами. Здесь показаны прототипы двух, наиболее часто встречающихся форм:

istream &get(char *buf, int num, char delim = ‘ \n’);

int get();

Функция get(), заданная первой перегруженной формой, считывает символы в массив, на который указывает buf до тех пор, пока, либо не считано num символов, либо не встретился символ, заданный delim. В конце массива, на который указывает buf, функция get() помещает ноль. Если параметр delim не задан, то по умолчанию в качестве ограничителя используется символ новой строки. Если символ ограничителя встречается во входном потоке, он не извлекается, а остается в потоке до следующей операции ввода.

Функция get(), заданная второй перегруженной формой, возвращает следующий символ потока. Она возвращает EOF, если был достигнут конец файла. Эта форма get() напоминает функцию getc() языка С.

Другой функцией для реализации ввода является getline(). Здесь показан ее прототип:

istream &getline(char *buf, int num, char delim = ‘\n’);

Как можно заметить, эта функция фактически тождественна версии get(buf, num, delim) функции get(). Она считывает вводимые символы из входного потока и помещает их в массив, на который указывает buf до тех пор, пока, либо не считано num символов, либо не встретился символ, заданный через delim. Если параметр delim не задан, то по умолчанию в качестве ограничителя используется символ новой строки. В конце массива, на который указывает buf, помещается ноль. Отличие между get(buf, num, delim) и getline() в том, что getline() считывает и удаляет из входного потока ограничитель. Используя функцию peek(), можно получить следующий символ из входного потока без его удаления из потока. Функция имеет следующий прототип:

int peek();

Она возвращает следующий символ из потока или EOF, если достигнут конец файла.

Используя функцию putback(), можно возвратить последний считанный из потока символ обратно в поток. Прототип функции:

istream &putback(char ch);

где с - это последний считанный из потока символ.

При выводе данные не записываются немедленно на связанное с потоком физическое устройство. Вместо этого, информация хранится во внутреннем буфере. Только после заполнения содержимое буфера переписывается на диск. Однако вызов функции flush() вызывает физическую запись информации на диск до заполнения буфера. Здесь показан прототип функции:

ostream &flush();

Вызовы функций flush() оправданы при работе в неблагоприятной обстановке (например, в ситуациях, когда часто случаются сбои по питанию).

Примеры:

1. Пример использования функции getline() для считывания строки с пробелами

#include <iostream.h>

#include <fstream.h>

main()

{ char str[80];

cout << "Ввелите ваше имя: ";

cin.getline (str,79);

cout << str << '\n';

return 0;

}

2. В реальном программировании особенно полезны функции реек() и putback(). Они позволяют упростить управление, когда неизвестен тип вводимой в каждый конкретный момент времени информации. Следующая программа иллюстрирует это. В ней из файла считываются строки либо целые переменные. Эти данные могут следовать в любом порядке.

// Демонстрация работы функции реек()

#include <iostream.h>

#include <fstream.h>

#include <ctype.h>

#include <stdlib.h>

main ()

{ char ch;

ofstream out("test");

if(!out)

{ cout << "Файл открыть невозможно\n.";

return 1;

}

char str[80], *p;

out << 123 << "это проверка" << 23;

out << "Привет!" << 99 << "sdf" << endl;

out.close (j);

ifstream in("test");

if (!in)

{ cout << "Файл открыть невозможно\n.";

return 1;

}

do

{ p = str;

ch = in. peek (); // выяснение типа следующего символа

if (isdigit (ch))

{ while (isdigit (*p=in.get ())) *p++; //считывание целого

in.putback (*p); //возврат символа в поток

*р = ' \0 '; //заканчиваем строку нулем

cout << "Целое: " << atoi(str);

}

else if (isalpha (ch)) //считывание строки

{ while(isalpha (*p=in.get())) *p++;

in.putback(*p); // возврат символа в поток

*p = ' \0 '; //заканчиваем строку нулем

cout << "Строка: "<< str;

}

else in.get(); //

cout>>’\n’;

}while (!in.eof ());

in.close();

return 0;

}





Дата публикования: 2015-02-22; Прочитано: 237 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...