{ char buf[1024];// Буфер
double a=2.2222, b=5.5555;
strstream f(buf, sizeof buf, ios::in|ios::out);
f << a << " " << b << '\0';// Запис у буфер
double x,y; f >> x >> y;// Читання з буфера
cout << x << " " << y << endl;// Виведення на екран
cout << buf << endl;// А що в буфері?
pause;
}
Одержання дескрипторів файлів
Для виконання деяких низькорівневих операцій з файлами використовуються дескриптори файлів. Дескриптор - унікальне ціле число, яке працює як логічний номер файлу. Потокові класи дозволяють досить просто одержати дескриптор будь-якого файлу. Розглянемо наступний приклад:
ifstream fa("A.dat");
cout << "Дескриптор файлу = << (fa.rdbuf())->fd() << endl;
Для визначення дескриптора спочатку викликається функція-член потоку rdbuf() класу fstream для об'єкта fa. Вона повертає адресу спеціального об'єкту класу filebuf, який асоційовано з fa. Такий об’єкт є буфер, що створюється для забезпечення роботи кожного потоку, він містить у собі також і дескриптор файлу. Далі викликається функція fd() - член класу filebuf, вона саме й повертає дескриптор файлу fa.
Для того, щоб уникнути записів громіздких і малозрозумілих виразів, які обчислюють дескриптори, можна побудувати спеціальну функцію або відповідний макрос. Нижче наведені приклади побудови функції й макросу для одержання дескрипторів файлів.
У наступному прикладі побудована зручна функція descr для одержання дескриптору файла.
// Приклад 8
#include <fstream.h>
template <class FSTR>
// шаблон FSTR може приймати значення,
// ifstream, ofstream, fstream
int descr(FSTR& f)
{ return (f.rdbuf())->fd();
}