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

}


 

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

2473. Оборудование, механизация и автоматизация сварочного производства 391.59 KB
  Данный сборник направлен на формирование умений применять полученные знания на практике, на реализацию единства интеллектуальной и практической деятельности. Механизация и автоматизация являются важнейшим средством повышения производительности труда, улучшения качества и условий труда в сварочном производстве.
2474. Теория электрических цепей. Автогенераторы 895.56 KB
  Изучение и компьютерное моделирование работы LC-автогенератора с трансформаторной обратной связью. В работе необходимо исследовать условия самовозбуждения автогенератора, а также научиться определять амплитуду напряжения на выходе автогенератора в стационарном режиме.
2475. Фінанси. Електронний курс лекцій 544.17 KB
  Сутність фінансів, їх функції і роль. Принципи структурування фінансової системи. Організаційна структура фінансової системи. Управління фінансовою системою та фінансова політика. Зовнішні і внутрішні фінансові відносини. Суть і склад державних фінансів. Бюджет держави: сутність і призначення. Пряме та непряме оподаткування в Україні. Страхування і страховий ринок. Визначення фінансового ринку і його елементи.
2476. Економічна статистика 731 KB
  Основи класифікації економічної статистики. Система національних рахунків – методологічна основа економічної статистики. Показники статистики населення. Завдання статистики населення. Показники чисельності та складу населення. Статистика використання робочого часу. Статистика науково-технічної та інноваційної діяльності. Оцінка рівня інфляції, її використання для порівняльного аналізу вартісних показників. Статистика доходів сектору домашніх господарств. Джерела інформації про споживання населенням.
2477. Основы аудита. Принципы профессиональной этики аудита 244 KB
  Структура договора на проведение аудиторской проверки. Предплановая (преддоговорная) деятельность. Документация аудитора. Обзор событий, произошедших после даты составления баланса. Планирование аудиторской проверки, ее назначение и принципы. Критерии отнесения организации к обязательному аудиту. Основные этапы становления и развития аудита в России.
2478. Теория общей химии с элементами методики преподавания 413 KB
  Экспериментальные (качественные) задачи по химии. Подготовка учителя к уроку. Понятие об энтропии и изобарно-изотермическом потенциале. Самостоятельная работа учащихся по химии. Задачи курса химии средней школы. Технические средства обучения. Структура нуклеотидов и нуклеозидов.
2479. Акушерство и гиникология. Аборты и гинекологическая помощь 1.27 MB
  Аборты, акушерская помощь. Агалактия и гипогалактия. Бесплодие и яловость животных. послеродовой парез. Аборт - прерывание беременности с последующим рассасыванием зародыша, мумификацией, мацерацией, путрификацией либо изгнанием из матки мертвого неизмененного плода (выкидыша) или незрелого живого плода (недоноска).
2480. Теорія адміністративної відповідальності при порушенні митних правил 289.5 KB
  Адміністративна відповідальність за порушення митних правил. Завдання, принципи та функції адміністративної відповідальності. Поняття, завдання та принципи провадження в справах про порушення митних правил. Опротестування постанови по справі про порушення митних правил. Свідки та поняті у справах про порушення митних правил.
2481. Высшая математика. Исследование интегралов и теоремы гипотез 147.5 KB
  Неопределённый интеграл и его свойства. Вычисление пути, пройденного точкой. Основные понятия и свойства числовых рядов. Разложение функций в ряд Тейлора. Формула Байеса (теорема гипотез). Формула Бернулли. Определение комплексного числа. Действия над комплексными числами в алгебраической форме.