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

}


 

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

74952. Розв’язування задач на зведення до одиниці. Вправи на засвоєння таблиці множення числа 8. Розпізнання многокутників 32.5 KB
  Удосконалювати вміння учнів розвязувати задачі на зведення до одиниці; домогтися засвоєння таблиці множення числа 8 напамять; закріплювати знання правил порядку дій; розвивати обчислювальні навички та вміння розвязувати рівняння...
74953. Письменное вычитание трёхзначных чисел. Сложные задачи – цена, количество, стоимость. Геометрический материал 188.5 KB
  Цель: Учить детей письменному вычитанию трехзначных чисел столбиком; закрепить умение делать правильный мотивированный выбор действия в задаче; выбирать арифметическое действие для решения задачи; составлять равенства на умножение деление; классифицировать и обобщать.
74954. Усвоение таблицы умножения и деления. Составление задачи по выражению 56 KB
  Цель. Совершенствовать умение решать выражения на основе знаний таблицы умножения и деления; развивать умение решать уравнения на нахождение неизвестного делителя; закреплять умение составлять и решать задачи по выражению, задачи на приведение к единице...
74955. Повторение табличного деления и умножения чисел 58.5 KB
  Цели и задачи: Образовательные: усвоение полученных знаний, умений и навыков при табличном делении и умножении; Развивающие: развивать наблюдательность и умение рассуждать; развивать математические способности, логическое мышление, внимание и интерес к предмету через игру...
74956. Додавання й віднімання виду 430 + 500, 430 + 50, 760 – 400, 760 – 40. Розширена задача на спосіб зведення до одиниці. Складена задача, яка включає суму двох або трьох доданків 54 KB
  Мета. Закріплювати вміння учнів додавати круглі трицифрові числа різними способами. Працювати над розв’язуванням задач. Розкриватимемо таємниці єгипетських пірамід. Розвивати обчислювальні навички, логічне мислення, пам’ять.
74957. Множення на 0, 1 35.5 KB
  МЕТА: Сформувати вміння та навички учнів при обчисленні прикладів на множення 0, 1; розвивати обчислювальні навички, розвивати пізнавальний інтерес до вивчення математики, виховувати уважність.
74958. Сравнение задач на пропорциональное деление. Деление с остатком трехзначных чисел на круглые десятки 43 KB
  Задачи: Развивать умение решать задачи на пропорциональное деление. Развивать навыки деления трехзначных чисел на круглые с остатком. Развивать логическое мышление, память, внимание. Воспитывать дружеские отношения в соревновании.
74959. Вправи і задачі на засвоєння таблиці ділення на 8. Задачі на знаходження невідомого діленого шляхом складання рівняння 60 KB
  Мета: закріпити таблицю ділення на 8 навчити розвязувати задачі на знаходження невідомого діленого складаючи рівняння повторити зв’язок дій множення і ділення; формувати вміння розвязувати задачі на три дії; розвивати логічне мислення увагу...
74960. Ознайомлення з художнім прийомом в живописі «пуантилізмом». Малювання рибки 36.5 KB
  МЕТА. Ознайомлення учнів з різноманітністю форм та забарвлення мешканців озер,річок, морів, океанів; ознайомити із художнім прийомом в живописі «пуантилізмом», формування навичок культури роботи з різними художніми матеріалами, виконання вправ на розвиток руки...