4873

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

Лекция

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

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

Русский

2012-11-28

41.5 KB

10 чел.

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

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

  •  при вводе каждая пара символов '\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 << "Вы не задали имя файла.";

}


 

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

84775. Исторические источники 27.5 KB
  Содержание материала учебника позволяет реализовать поставленные цели и задачи урока применяя современные технологии: ИКТ на этапе получение новых знаний связанных со зрительным восприятием исторических источников; деятельностный подход на этапе самостоятельного получения новых знаний...
84776. Площадь прямоугольника 69.5 KB
  Наш урок мне бы хотелось начать со слов: «Только то и приятно, что трудно достать» М.Твен Как эти слова можно отнести к нашему уроку математики? Я думаю, мы сегодня испытаем удовольствие от работы. Вам известен автор этих слов? Внимательно посмотрите на экран. Слайд с эпизодом.
84777. Конспект урока обществознания: «Богатые» 33 KB
  Значит к теме нашего урока Богатые мы поставили цель: показать особенности положения в обществе богатых людей. По каким характеристикам людей относят к страте богатых Кто такие богатые люди учащиеся предлагают характеристики На доске выстраивается систематизация особенностей страты богатых...
84778. Основы религиозных культур и светской этики 35.5 KB
  Ключевые понятия: семья, род, родословная, имя рода - фамилия, семейные роли, семейные ценности. Цель: иметь представление о себе как части рода и осознавать, что семья - носитель нравственных ценностей, на основе которых формируются нравственные отношения.
84779. Условный оператор на языке Pascal 81 KB
  Цель: Ребенок, который имеет представление об условном операторе на языке Pascal; умеет писать простейшие программы с условным оператором на языке Pascal. Задачи: систематизация знаний по теме «Условный оператор»; выработка практических умений в разработке программ на языке Pascal...
84780. «В очаровании русского пейзажа». Природа в очерках Константина Паустовского 73 KB
  А природу нашей земли Константин Паустовский знал хорошо. Как была открыта эта земля Паустовский описал в очерке Коротко о себе. Что обозначает этот термин Поэтический прием при котором один предмет или явление сравнивается с другим Давайте вспомним их: Мещерские леса величественны...
84781. Начало Отечественной войны 1812 года 161.5 KB
  Цель урока: Сформировать у обучающихся представления о Отечественной войне 1812 года как героической странице российской истории. Образовательные: проанализировать причины цели и характер войны России с наполеоновской Францией в 1812 году; охарактеризовать основные события войны...
84782. Путешествие по компьютеру 60.5 KB
  Тип урока: урок-повторение с применением игровых технологий Вид: комбинированный урок Технология: личностно-ориентированная игровая Цели урока: Обучающая создать условия для закрепления первичного представления об устройстве компьютера назначении его составных частей и периферийных устройств.