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

}


 

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

79054. Проблема «опыта» и истины в философии науки нач. 20 в. (Э. Мах, Авинариус, А. Пуанкаре) 34.5 KB
  Проблема опыта и истины в философии науки нач. Эмпириокритицизм философская система чистого опыта критический эмпиризм который стремиться ограничить философию изложением данных опыта при полном исключении всякой метафизики с целью выработки и естественного понятия о мире. Нейтральный элемент опыта одновременное включение духовного и материального начала. Авенариусом буквально означает критику опыта.
79055. Вклад неопозитивизма в развитии логики и методологии науки 37 KB
  Вклад неопозитивизма в развитии логики и методологии науки. Логика науки применение идей методов и аппарата логики в анализе научного познания. Развитие логики всегда было тесно связано с практикой теоретического мышления и прежде всего с развитием науки. Методология науки в традиционном понимании это учение о методах и процедурах научной деятельности а также раздел общей теории познания в особенности теории научного познания эпистемологии и философии науки.
79056. Концепция философии науки Т. Куна 25.5 KB
  Концепция философии науки Т. Важнейшей характеристикой знания является его динамика его рост изменение развитие В современной западной философии проблема роста развития знания является центральной в философии науки. переход к новому периоду нормальной науки . Причем последние гораздо более редки в истории развития науки по сравнению с первыми.
79057. Концепция философии науки К. Поппера 28.5 KB
  Карл Поппер предложил в 1967 году различать следующие три мира: во-первых мир физических объектов или физических состояний; во-вторых мир состояний сознания мыслительных ментальных состояний в-третьих мир объективного содержания мышления мир научных идей проблем поэтических мыслей и произведений искусства. Этот третий мир вполне объективен и осязаем. Это мир книг библиотек географических карт мир произведений живописи. Концепция Поппера подчёркивает своеобразие и загадочность знания как объекта исследования: для того чтобы...
79058. Развитие философии науки постпозитивизмом (И.Локатос, П. Фейерабенд, М. Полани) 38.5 KB
  В 60-70 годы 20 века в зап. философии науки развивается течение постпозитивизма. Постпозитивисты (Поппер, Мун, Лакатос, Фейрабенб, Полани) подвергли критике позитивистский идеал факта, введя в анализ науки историческое
79059. Право цивильное и право преторское. Римские магистраты и значение их эдиктов для выработки новой системы права. Процесс взаимодействия права цивильного и преторского. Кодификация эдиктов 28.54 KB
  Римские магистраты и значение их эдиктов для выработки новой системы права. Процесс взаимодействия права цивильного и преторского. civilis гражданский или квиритское право римляне называли себя квиритами в честь бога войны Яна Квирина совокупность норм права исходящих от народного собрания позднее сената. Источники цивильного права обычаи и законы.
79060. Понятие наследования. Сущность и происхождение наследования. Виды наследования 24.25 KB
  Подобно тому как собственность в экономическом смысле существовала и до образования государства и права а право собственности появилось только с образованием государства так и наследственное право в качестве завершения права собственности появилось только с возникновением государства. Универсальный характер наследования проявляется в том что к наследнику переходят сразу и права и обязанности входящие в состав наследства в том что наследник может приобрести в составе наследства даже такие права и обязанности о существовании которых он...
79061. Понятие права собственности. Содержание права собственности 27.13 KB
  Содержание права собственности. Понятие права собственности и развитие этого института в Риме. Римское право было системой права построенного на начале частной собственности.
79062. Понятие римского частного права. Отличие частного права от права публичного. Основные системы римского частного права 20.29 KB
  Отличие частного права от права публичного. Основные системы римского частного права. Один из римских юристов классического периода Ульпиан проводит разграничение этих двух областей права следующим образом.