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

Неформатируемый двоичный ввод/вывод



На нижнем уровне функций двоичного ввода/вывода находятся функции 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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



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