Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мет_2 часть_укр.doc
Скачиваний:
1
Добавлен:
09.11.2019
Размер:
938.5 Кб
Скачать

8.1.4. Неформатоване двійкове введення-виведення

Текстові файли зручні для сприйняття, однак більш гнучку структуру мають двійкові (бінарні) файли. Такі файли призначені для неформатованого введення-виведення, що здійснюється за допомогою функцій: put(), get(), getline(), а також write() і read().

  1. Побайтове введення-виведення. Функція get() зчитує один байт із потоку й передає його значення аргументу s, а функція put()записує символ s у потік і повертає посилання на потік:

istream &get (char &s);

ostream &put (char s);

  1. Блокове введення-виведення. Функція read() зчитує з потоку стільки байтів, скільки задано в аргументі num, і передає їх у буфер, який визначений покажчиком buf. Функція write() вилучає num байтів з буфера buf і записує їх у потік.

istream &read (char *buf, num);

ostream &write (const char *buf, num);

  1. Рядкове введення. Функція getline() зчитує з потоку символи й передає їх у буфер buf доти, поки не буде зчитано (num-1) символів, або не зустрінеться символ нового рядка:

istream &getline (char *buf, num);

Відкриття й закриття бінарних файлів здійснюється точно так само, як і текстових файлів.

Приклад зчитування двійкового файлу:

int main(){

char ch;

ifstream in("test", ios::in | ios::binary);

if(!in) {cout << "Can't open file\n";

return 1; }

while(!in.eof()) {in.get(ch);

cout << ch; }

in.close();

return 0; }

Приклад запису із клавіатури у двійковий файл. Введення символів у файл припиняється при натисканні клавіші #.

int main(){

char ch;

ofstream out("test", ios::out | ios::binary);

if(!out) {cout << "Can't open file\n";

return 1; }

cout<<"For ending input #\n";

do {cout << ": ";

cin.get(ch);

out.put(ch);

} while (ch!='#');

out.close();

return 0; }

Приклад відкриття й зчитування текстового файлу. Можливе відкриття текстового файлу в бінарному режимі. Цей приклад ілюструє, як функції, призначені для роботи із двійковими файлами, можуть бути використані для операцій з текстовими файлами.

int main () {

char c, str[256];

ifstream is;

cout << "Enter the name of an existing file: ";

cin.get (str,256);

is.open (str); // Відкрити файл

while (is.good()){ //Почати цикл, якщо немає помилок

c = is.get(); //Взяти символ з файлу

cout << c; } //Вивести символ на екран

is.close();

return 0; }

Функція good() повертає true, якщо відсутні помилки при відкритті файлу.

Приклад блокового введення-виведення. Запис файлу в пам'ять.

int main () { int length;

char * buffer;

ifstream is;

is.open ("test", ios::binary );

is.seekg (0, ios::end); //Визначення

length = is.tellg(); //довжини файлу

is.seekg (0, ios::beg);

buffer = new char [length];

is.read (buffer,length); //Читання даних блоку

is.close();

cout.write (buffer,length);

return 0; }

8.1.5. Файли довільного доступу

Система введення-виведення С++ дозволяє створювати файли, що складаються із записів фіксованої довжини. Це забезпечує легкий пошук інформації при довільному доступі до файлу. Довільний доступ реалізується за допомогою потокових функцій введення й виведення: seekg() і seekp().

Для пошуку запису задається початок відліку (прапорці ios::beg, ios::end або ios::cur) і зсув покажчика відносно початку відліку. Наприклад, функція seekg(120,ios::beg) установлює покажчик зчитування файлу в позицію, що відстоїть на 120 байтів від початку файлу. А функція seekp(8,ios::end) установлює покажчик запису в позицію, що відстоїть на 8 байт від кінця файлу.

Файли довільного доступу повинні відкриватися в режимі операцій для двійкових файлів. Визначити поточну позицію кожного із двох покажчиків можна за допомогою функцій tellg() (повертає позицію покажчика зчитування) tellp() (повертає позицію покажчика запису).

Приклад. Заміна символу в зазначеній позиції.

int main () {

char * buffer;

fstream in;

in.open ("test.txt", ios::in|ios::out|ios::binary );

in.seekp(2,ios::beg); //Установка покажчика запису

in.put('r'); //Заміна символу

in.close();

return 0; }

Приклад зчитування певного рядка таблиці. Нехай створений файл довільного доступу, що містить таблицю, що складається з рядків-записів. Довжина кожного запису визначається зміною length. Код, що забезпечує зчитування другого запису, виглядає як:

char ch;

in.unsetf(ios::skipws); //Не пропускати пробіли

in.seekg(length,ios::beg);//Зчитування, починаючи з 2-го рядка

for (;;){in >> ch;

//Припинення зчитування наступних рядків

if (in.tellg()>2*length) break;

cout << ch; }