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

}


 

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

32985. ПОСТНЕКЛАССИЧЕСКАЯ НАУКА: МЕТОДОЛОГИЧЕСКИЕ ОСНОВАНИЯ И ФИЛОСОФСКИЕ ПОСЛЕДСТВИЯ 18.97 KB
  В качестве парадигмальной теории постнеклассической науки выступает синергетика теория самоорганизации изучающая поведение открытых неравновесных систем. Наиболее ценным достижением постнеклассической науки выступает предпринятая в ней попытка соединения объективного мира и мира человека. Гуманитарные и естественные науки больше не представляются разделенными непреодолимой пропастью.
32986. ПРЕДМЕТНЫЕ СФЕРЫ И ГРАНИ ВЗАИМОДЕЙСТВИЯ ФИЛОСОФИИ И НАУКИ (Ф.ФРАНК. КАКАЯ ПОЛЬЗА В ФИЛОСОФИИ НАУКИ) 18.2 KB
  ПРЕДМЕТНЫЕ СФЕРЫ И ГРАНИ ВЗАИМОДЕЙСТВИЯ ФИЛОСОФИИ И НАУКИ Ф. КАКАЯ ПОЛЬЗА В ФИЛОСОФИИ НАУКИ 1. философия всегда стремилась связать абстрактные положения науки со здравым смыслом вырабатывая тем самым единый и доступный рациональному пониманию взгляд на мир из которого вытекают определенные принципы человеческого поведения и деятти задача философии науки – гуманизация науки и преодоление разрыва м у ее гуманитарными и естественнонаучными областями 2. Философия науки – связующее звено способное обеспечить единое научное понимание мира и...
32987. ПРИРОДА И СУЩНОСТЬ НАУЧНЫХ РЕВОЛЮЦИЙ (Т.КУН. СТРУКТУРА НАУЧНЫХ РЕВОЛЮЦИЙ) 14.44 KB
  Развитие науки процесс поочередной смены 2х периодов: 1 нормальная наука безраздельно господствует парадигма 2 научная революция : распад парадигмы конкуренция м у альтернативными парадигмами победа одной из них переход к новому периоду нормальной науки . Свва парадигмы: 1 принята научным сообщвом как основа для дальнейшей работы; 2 содержит переменные вопросы т. Переход одной парадигмы к др. 2 Период нормальной науки : начинается с признания парадигмы формулируются и широко применяются самые многообразные и...
32988. ПРИРОДА И СУЩНОСТЬ НАУЧНЫХ РЕВОЛЮЦИЙ 23.48 KB
  Макс Планк – старое поколение ученых не приживается к новым идеям однако они отходят от науки и умирают. компонентов науки. Есть микрореволюции – в рамках той или иной науки физика биология экология; глобальные революции появление науки религии. философии проблема роста развития знания является центральной в философии науки.
32989. Общественное сознание и его структура 17.1 KB
  Конец формы Общественное сознание и его структура. Если сознание есть во многом продут социальный есть порождение общественных отношений то что такое общественные отношения общественное сознание Какова их структура Механизм работы И здесь наблюдаются определенные отличия индивидуального сознания и общественного сознания. Вопервых индивидуальное сознание имеет границы жизни обусловленные жизнью конкретного человека. Общественное же сознание может охватывать жизнь множества поколений.
32990. Структура общественного сознания и его основные формы 15.45 KB
  Обыденное и теоретическое сознание.Общественное сознание – это совокупность идей взглядов и оценок свойственных данному обществу в осознании им собственного бытия.Индивидуальное сознание – это совокупность идей взглядов чувств свойственных конкретному человеку.ОБЩЕСТВЕННОЕ СОЗНАНИЕ складывается на основе сознаний отдельных людей но не является их простой суммой.
32991. Философия истории 29.45 KB
  заключается ли он в самой ткани исторического события или он следствие нашей позднейшей его интерпретации Имеет ли история направление Кто является творцом истории Как возможно историческое событие Важнейшее отличие философии истории от истории состоит в том что если историю интересует причины определенных конкретных событий то философия истории анализирует общие закономерности исторического процесса в целом. в таких работах как “Экономическофилософские рукописи 1844 года†“Святое семействНемецкая идеология†а в...
32992. Марксистская концепция общественного развития 22.24 KB
  Подобно Гегелю марксисты рассматривают мировую историю как единый закономерный процесс а исторический материализм призван изучать наиболее общие законы развития человеческого общества. Естественно что вначале эти идеи выступали как гипотезы а затем по мере развития социальной науки сами основоположники и их последователи в первую очередь советские обществоведы превратили ее в хорошо структурированную и аргументированную социальную теорию. В своем основном труде Капитал Маркс осуществил детальный анализ капиталистического общества...
32993. Как выглядит цивилизационная модель философии истории Освальда Шпенглера 16.52 KB
  Ожидается как он полагал появление русскосибирской культуры. В основе каждой культуры лежит душа а культура это символическое тело жизненное воплощение этой души. Так непредсказуемое неспланированное рождение конкретной культуры он связывает с хаотическим проявлением таинственности душевной жизни. Зато поэтапное становление культуры проходящей как и человек свои возрастные ступени Шпенглер склонен связывать со спиралью.