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 << "Вы не задали имя файла.";

}


 

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

6340. Визначні етичні вчення 43.5 KB
  Визначні етичні вчення План Сутність етичного вчення Будди. Сутність етичного вчення Конфуція. Сутність етичного вчення Мойсея та Ісуса Христа. Етичні вчення XIX - XXстоліття Великі моральні пророки - Конфуцій, Бу...
6341. Джерела та основні принципи трудового права 217.5 KB
  Джерела та основні принципи трудового права Поняття джерел трудового права України, їх класифікація Суспільні відносини, що виникають при використанні праці, потребують правового регулювання, яке здійснюється прийняттям відповідних юридичних но...
6342. Форматування символів і абзаців. Форматування сторінок документа 193.5 KB
  Форматування символів і абзаців Форматування документа - це процес оформлення його загального вигляду та підготовки до друкування, тобто робота над формою (зовнішнім виглядом) документа. Текст можна форматувати під час його набирання або після ...
6343. Екологічні фактори 132.5 KB
  Екологічні фактори Поняття про екологічні фактори, їх види Абіотичні фактори. Біотичні фактори. Антропогенні фактори. Дія екологічних факторів. I. ПОНЯТТЯ ПРО ЕКОЛОГІЧНІ ФАКТОРИ, ЇХ ВИДИ. В процесі еволюційного ро...
6344. Інтернет у системі джерел банківської, фінансової і підприємницької інформації 38.53 KB
  Інтернет у системі джерел банківської, фінансової і підприємницької інформації 1. Світовий ринок інформаційних технологій у фінансовій сфері. Розглянемо результати і перспективи розвитку ринку інформаційних технологій та нові тенденції. Слід відміти...
6345. Основні законодавчі акти, норми та правила, що регулюють умови праці та її охорону в Україні 130 KB
  Основні законодавчі акти, норми та правила, що регулюють умови праці та її охорону в Україні Конституція України - основа всього законодавства країни, прийнята 28 червня 1996 року. Вона містить ряд статей, які стосуються питань охорони праці, з...
6346. Юрист, як представник фізичних і юридичних осіб в сфері кримінального судочинства 145.5 KB
  Зміст 1. Право особи на отримання кваліфікованої юридичної допомоги: конституційно та міжнародно-правові аспекти. 2. Правові підстави участі представника у кримінальному судочинстві. 3. Правові підстави участі захисника у кримінальному судочин...
6347. Міжнародний спортивний рух. Фізкультурно-спортивний рух в Україні 162 KB
  Міжнародний спортивний рух. Фізкультурно-спортивний рух в Україні Метою лекції є вивчення особливостей становлення та розвитку міжнародного спортивного руху та фізкультурно-спортивного руху в Україні. Завдання лекції: Виявити закономірності ст...
6348. Інформаційна система та її структура 129.5 KB
  Інформаційна система та її структура Мета: Дати поняття інформаційної системи, апаратної та програмної складової ІС Розглянути функціональну схему комп'ютера (принцип фон Неймана) Розглянути магістрально-модульний принцип будо...