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

}


 

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

30043. ВИЗУАЛИЗАЦИЯ ЧИСЛЕННЫХ МЕТОДОВ. РЕШЕНИЕ ОБЫКНОВЕННЫХ ДИФФЕРЕНЦИАЛЬНЫХ УРАВНЕНИЙ 232 KB
  Метод Эйлера модифицированный стр. В данной курсовой работе требуется вычислить дифференциальное уравнение способами Эйлера и Эйлера модифицированный: Результаты вычислений должны содержать: точное значение уравнения приближенные значения графики Решение обыкновенных дифференциальных уравнений. Одношаговыми являются метод Эйлера и методы Рунге Кутта.
30047. Древовидные (иерархические) структуры данных в реляционных базах данных 1006.5 KB
  Сегодня большинство хранилищ данных как простых так и сложных построены на основе реляционных баз данных. Реляционные базы данных в большинстве случаев удовлетворяют требования какойлибо предметной области данных но часты и случаи когда требуется представление и хранение данных в иерархическом виде. Это снизит защищенность данных но избавит нас от долгих раздумий в самом начале пути.
30048. База данных пользователей сети 318.5 KB
  Далее в пояснительной записке прилагается подробное описание этапов создания автоматизированной информационной системы полное описание постановки задачи графический интерфейс программы и листинг полученной программы. Общий интерфейс АИС Рисунок 5 Форма: баланс Рисунок 6 форма: конфигурация сети Рисунок 7 Отчет Приложение 2 Листинги запросов Запрос1: CLOSE ALL use CLEAR PUBLIC q input ' Введите номр модема ' to q select distinct a. Лист № докум. Подпись Дата Лист 2 681.
30049. Решить дифференциальное уравнение с заданными начальными значениями 127.71 KB
  Данное уравнение необходимо решить методом Эйлера и Эйлера модифицированного а также сравнить результаты и сделать вывод об эффективности методов построить их графики.Метод Эйлера Данный метод одношаговый. Обобщим формулу для решения дифференциальных уравнений методом Эйлера: у х у 3.Эйлер модифицированный Для уменьшения погрешности вычислений часто используется модифицированный метод Эйлера.
30050. ВЫЧИСЛИТЕЛЬНАЯ ТЕХНИКА 203.5 KB
  Торопова ВЫЧИСЛИТЕЛЬНАЯ ТЕХНИКА Методические указания по выполнению курсовой работы для специальностей 210406. Методические указания по выполнению курсовой работы по дисциплине Вычислительная техника предназначены для студентов специальностей 210406. Методические указания содержат организацию выполнения курсовой работы индивидуальные задания курсовой работы методические указания по выполнению курсовой работы и литературу. Рекомендовано НМС УрТИСИ ГОУ ВПО СибГУТИ в качестве методических указаний по выполнению курсовой работы студентами...