Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
На нижнем уровне функций двоичного ввода/вывода находятся функции get() и put(). Используя функцию-член put(), можно записать байт; считать байт можно, используя функцию-член get(). Функция get() имеет множество форм. Здесь приведены наиболее часто встречающиеся формы функций get() и put():
istream &get (char &ch);
ostream &put (char ch);
Функция get() считывает один символ из соответствующего потока и передает его значение в ch. Она возвращает ссылку па поток, которая будет равна нулю, если встретится EOF. Функция put() записывает ch в поток и возвращает поток.
Для записи и считывания блоков двоичных данных используются функции C++ read() и write(). Здесь показаны их прототипы:
istream &read (unsigned char *buf, int num);
ostream &write (const unsigned char *buf, int num);
Функция read() считывает num байт из соответствующего потока и передает их в буфер, на который указывает buf. Функция write() записывает num байт в соответствующий поток из буфера, на который указывает buf.
Если достигается конец файла до того, как были считаны num символов, read() просто останавливается, а в буфере оказывается столько символов, сколько их было в файле. Узнать, сколько символов было считано, можно с помощью другой функции-члена, называемой gcount(), прототип которой: int gcount ();
Она возвращает количество символов, считанных последней операцией двоичного ввода.
Примеры:
1. Следующая программа выводит на экран содержимое любого файла, используя функцию get().
#indude <iostream.h>
#include <fstream.h>
main()
{ char ch;
ifstream in("test");
if (!in)
{ cout << "Файл открыть невозможно|n";
return 1;
}
while(!in.eof())
{ in.get(ch);
сout<<ch;
}
return 0;
}
2. Следующая программа использует функцию put() для записи в файл символов, вводимых пользователем. Программа завершается при вводе символа доллар ($).
#include <iostream.h>
#include <fstream.h>
main ()
{ char ch;
ofstream out("test");
if(!out)
{ cout << "Файл открыть невозможно|n";
return 1;
}
cout << "Для остановки введите символ $ \ n ";
do
{ cout << ": ";
cin.get(ch);
out.put(ch);
} while (ch! =' $ ');
cut. close ():,
}
Обратите внимание, что для считывания символов из cin в программе используется get(). Это необходимо, поскольку при использовании оператора >> будет пропущен начальный пробел. В отличие от этого оператора функция get() пробелы не игнорирует.
3. В этой программе используется write() для записи числа типа double и строки в файл с именем test и read() для чтения файла:
#include <iostream.h>
#include <fstream.h>
#include <string.h>
main()
{ ofstream fout("test"); // создание обычного файла вывода
if(!fout)
{ cout << "Файл открыть невозможно\n";
return 1;
}
double num = 100.45;
char str[ ] = "Это проверка";
out.write ((char *) &num, sizeof(double));
out.write(str, strlen(str));
out.close ();
ifstream in ("test"); // создание обычного файла ввода
if(! in)
{ cout << "Файл открыть невозможно\n";
return 1;
}
double num;
char str[80];
in. read ((char *) &num, sizeof (double));
in. read (str, 15);
cout << num << ' ' << str;
in.close();
return 0;
}
Приведение типа к (char*) в вызове функций write() и read() необходимо, если буфер вывода задан не как символьный массив. Поскольку в C++ осуществляется строгий контроль типов, указатель на один тип не преобразуется автоматически в указатель на другой тип.
4. В следующей программе сначала массив double записывается в файл, а затем считывается обратно. Кроме того, отображается число считанных символов.
// Демонстрация работы функции gcount()
#include <iostream.h>
#include <fstream.h>
main()
{ ofstream out ("test");
if(!out]
{ cout << "Файл открыть невозможно\n";
return 1;
}
double nums[4] = {1.l, 2.2, 3.3, 4.4 };
out. write ((char *) &nums, sizeof (nums));
out.close ();
ifstream in ("test ");
if(!in)
{ cout << "Файл открыть невозможно\n";
return 1;
}
in.read ((char *) &nums, sizeof (nums));
for(i=0;i<4;i++)
cout<<nums[i];
cout<<" \n";
cout<<in.gcount() <<" символов считано \n";
return 0;
}
Дата публикования: 2015-02-22; Прочитано: 1087 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!