4873

Режимы работы с файлами. Чтение и запись в бинарном режиме

Лекция

Информатика, кибернетика и программирование

Режимы работы с файлами. Чтение и запись в бинарном режиме. Файлы с произвольным доступом. Позиционирование. При работе с файлом, открытым в текстовом режиме, происходит следующее...

Русский

2012-11-28

41.5 KB

9 чел.

Режимы работы с файлами. Чтение и запись в бинарном режиме. Файлы с произвольным доступом. Позиционирование.

При работе с файлом, открытым в текстовом режиме, происходит следующее:

  •  при вводе каждая пара символов '\r' + '\n' (возврат каретки + перевод строки) преобразуется в символ перевода строки ('\n');
  •  при выводе каждый символ перевода строки ('\n') преобразуется в пару '\r' +'\n' (возврат каретки + перевод строки).

Текстовые файлы предполагают, что их содержимое может быть прочитано человеком, поэтому, как правило, в текстовые файлы выводится информация в «удобочитаемом» виде, т.е. все данные явно преобразуются в некоторое строковое представление с использованием печатных символов.

Если же файл используется для вывода данных, предполагающих последующее использование их для ввода в программу (возможно, другую), строковое преобразование и лишние байты форматирования ни к чему. С этой целью система ввода-вывода предоставляет возможность осуществления неформатируемого ввода-вывода, то есть записи и чтения двоичной информации («сырых» данных – англ. raw data). Для осуществления ввода-вывода в двоичном режиме применятся флаг ios::binary в параметре open_mode, при создании соответствующего потока или использовании функции open(). Чтение двоичной информации из файла осуществляется функцией read(), которая имеет следующие прототипы:

istream & read( char* s, int n );

istream & read( unsigned char* s, int n );

Здесь параметр s задает буфер (временные массив-хранилище) для считывания данных, а параметр n – число читаемых символов.

Запись двоичных данных осуществляет функция-член write():

ostream & write( const char * s, int n );

ostream & write( const unsigned char * s, int n );

Эта функция получает n символов из буфера, адрес которого задан параметром s, и вставляет их в поток вывода. Рассмотрим пример.

#include <fstream>

#include <iostream>

using namespace std;

void main()

{

 int x = 255;

 char str[80] = "Использование двоичного ввода-вывода.";

 // Открываем файл для вывода в двоичном режиме

 ofstream ofs("test.dat");

 

if ( ! ofs )

 {

 cout << "Файл не открыт" << endl;

 return;

}

 

ofs.write( ( char * ) & x, sizeof( int ) );

ofs.write( ( char * ) & str, sizeof( str ) );

 ofs.close();

 

 // Открываем файл для ввода в двоичном режиме

 ifstream ifs("test.dat");

 if ( ! ifs )

 {

 cout << "Файл не открыт.\n";

 return;

}

 

ifs.read( ( char * ) & x, sizeof( int ) );

ifs.read( ( char * ) str, sizeof( str ) );

cout << x << '\n' << str << '\n';

}

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

istream & seekg( long pos );

istream & seekg( long pos, seek_dir dir );

ostream & seekp( long offset );

ostream & seekp( long offset, seek_dir dir );

Здесь параметр pos задает абсолютную позицию в файле относительно начала файла. Параметр offset задает смещение в файле, а параметр dir – направление смещения, которое может принимать значения в соответствии с определением из класса ios:

ios::beg – смещение от начала файла, 
ios::cur – смещение относительно текущей позиции, 
ios::end – смещение от конца файла.

С каждым потоком связан указатель позиционирования, который изменяет свое значение в результате операции ввода или вывода. Для выполнения операций произвольного доступа файл должен открываться в двоичном режиме.

Получить текущее значение позиции в потоке ввода или вывода можно с помощью функций tellg() и tellp(), соответственно. Эти функции имеют прототипы:

long tellg();

 long tellp();

Следующий пример демонстрирует возможность позиционирования потока ввода информации:

#include <fstream>

#include <iostream>

using namespace std;

void main( int argc, char* argv[] )

{

 int size = 0;

 

 if (argc > 1)

 {

 const char * fileName = argv[1];

 ofstream of;

 of.open( fileName, ios::binary );

 

 for( int i = 0; i < 100; ++i )

  of.put( (char)( i + 27 ) );

 

 of.close();

 

 ifstream file;

 file.open( fileName, ios::in | ios::binary );

 if ( file )

 {

  file.seekg( 0, ios::end );

  size = file.tellg();

  if ( size < 0 )

  {

   cerr << fileName << " не найден.";

   return;

  }

  cout << fileName << " size = " << size;    

 }

}

 else 

 cout << "Вы не задали имя файла.";

}


 

А также другие работы, которые могут Вас заинтересовать

16983. Побудова графіків функцій засобами Maple 184 KB
  Тема: Побудова поверхонь графіків функцій в Maple. Мета: Навчитися будувати графіки в різних системах координат а також будувати поверхні в середовищі Maple. Обладнання: ПК зі встановленим математичним пакетом Maple. Індивідуальне завдання
16984. Загальне використовування даних додатками Windows. Буфер обміну. Технологія OLE 7.02 MB
  Практична робота №5 Тема: Загальне використовування даних додатками Windows. Буфер обміну. Технологія OLE. Мета: Ознайомитися з технологією OLE і загальним використовуванням даних додатками Windows. Устаткування: ПК. Операційна система Windows. Індивідуальне завдання ...
16985. Створення таблиць та обробка табличних даних засобами Word 222.5 KB
  Практична робота № 11 Тема: Створення таблиць та обробка табличних даних засобами Word Мета: засвоїти засоби створення редагування та форматування двовимірних таблиць а також організацію обробки та сортування табличних даних у програмі Word. Обладнання: персональний ...
16986. Введення таблиць. Автозаповнення формулами. Сортування даних 676.5 KB
  Практична робота №14 Тема: Введення таблиць. Автозаповнення формулами. Сортування даних. Мета: Навчитися використовувати функцію авто заповнення формулами та сортувати дані у таблицях. Обладнання: ПЕОМ. Табличний процесор MS Excel. Правила ТБ Індивідуальне з
16987. Побудова діаграм 308 KB
  Практична робота №15 Тема: Побудова діаграм. Мета: Навчитися будувати діаграми змішаного типу та кругові діаграми. Обладнання: ПЕОМ. Табличний процесор MS Excel. Хід виконання Правила ТБ Індивідуальне завдання 1. За даними табл. 3 побудувати діаграму зміша...
16988. Фільтрація даних. Критерії фільтрації 1.03 MB
  Практична робота №16 Тема: Фільтрація даних. Критерії фільтрації. Мета: Навчитися використовувати фільтрацію даних та навчитися використовувати Автофильтр та Расширенный фильтр. Обладнання: ПЕОМ. Табличний процесор MS Excel. Хід виконання Правила ТБ Інд
16990. Рішення задач матричної і векторної алгебри в Maple 356.5 KB
  Практична робота №30. Тема: Рішення задач матричної і векторної алгебри в Maple. Мета: Навчитися обчислювати визначників вирішувати системи лінійних рівнянь методом Крамера і матричним способом а також знаходити значення матричного многочлена використовуючи можлив
16991. Диференціальне і інтегральне числення функцій одного і декількох змінних в Maple 430.5 KB
  Практична робота №31. Тема: Диференціальне і інтегральне числення функцій одного і декількох змінних в Maple. Мета: Навчитися обчислювати межі часткову суму послідовностей похідні функцій і інтеграли в середовищі Maple. Обладнання: ПК зі встановленим математичним па