4872

Файловые потоки. Чтение и запись текстовых файлов

Лекция

Информатика, кибернетика и программирование

Файловые потоки. Чтение и запись текстовых файлов. Файлом называют поименованный блок данных на внешнем устройстве памяти. Файлы являются объектами файловой системы, являющейся частью операционной системы. Операционная система предоставляет приложен...

Русский

2012-11-28

54.5 KB

7 чел.

Файловые потоки. Чтение и запись текстовых файлов.

Файлом называют поименованный блок данных на внешнем устройстве памяти. Файлы являются объектами файловой системы, являющейся частью операционной системы. Операционная система предоставляет приложениям набор функций для работы с файлами. Несмотря на то, что в разных операционных системах работа с файлами может существенно отличаться, определенный набор базовых концепций будет иметь сходства.

Чтобы позволить программисту абстрагироваться от специфических особенностей, присущих той или иной файловой системе, в состав стандартной библиотеки С++ входит набор инструментов, представляющих универсальный интерфейс для работы с файлами. Разработчики компилятора С++ для определенной операционной системы берут на себя реализацию этого интерфейса в соответствии с правилами соответствующей файловой системы.

Для осуществления операций с файлами предусмотрено три особых типа данных (класса): ifstreamofstream и fstream. Для их использования необходимо подключить одноименные заголовочные файлы. Эти типы данных работают с понятием «поток данных» (поток - англ. stream). Поток представляет собой абстракцию непрерывной последовательности данных. Открытие файла для чтения или записи связывает его с соответствующим потоком, запись в файл интерпретируется как передача данных в поток, а чтение – как извлечение данных из потока. ifstream соответствует файловому потоку для чтения (от input file stream), ofstream – для записи (output file stream), fstream – универсальный поток для чтения и записи.

Использование потоковых классов во многом схоже с вводом-выводом данных в консоль (также называемую стандартным потоком ввода-вывода) с помощью предопределенных потоковых объектов cin и cout. В частности, для файловых потоков определены аналогичные операторы форматируемого ввода-вывода >> и <<. Отличие же заключается в том, что файловый поток должен быть связан с файлом прежде, чем его можно будет использовать. Кроме того, файловый поток можно позиционировать в произвольную позицию в файле, в то время как для предопределенных потоков это обычно не имеет смысла.

Для создания файлового потока эти типы данных предусматривают следующие варианты:

  •  создать поток, не связывая его с файлом:

ifstream();

ofstream();

fstream();

  •  создать поток, открыть файл и связать поток с файлом:

ifstream( const char *name, ios::openmode mode = ios::in );

ofstream( const char* name, ios::openmode mode = ios::out | ios::trunk );

fstream( const char * name, ios::openmode mode = ios::in | ios::out );

Чтобы открыть файл для ввода или вывода, можно либо использовать второй вариант создания cоответствующего потока:

fstream fs( "filename.dat" );

либо вначале создать поток с помощью первого варианта, а затем открыть файл и связать поток с открытым файлом, вызвав функцию-член open(). Эта функция определена в каждом из классов потокового ввода-вывода и имеет следующие прототипы:

void ifstream::open( const char *name, ios::openmode mode = ios::in );

    void ofstream::open( const char * name, ios::openmode mode = ios::out | ios::trunk );

    void fstream::open( const char * name, ios::openmode mode = ios::in | ios::out );

Здесь name – имя файла, mode – режим открытия файла. Параметр mode может принимать значения, указанные в таблице:

Режим открытия

Назначение

ios::in

Открыть файл для чтения

ios::out

Открыть файл для записи

ios::ate

Начало вывода устанавливается в конец файла

ios::app

Открыть файл для добавления в конец

ios::trunc

Усечь файл, то есть удалить его содержимое

ios::binary

Двоичный режим операций

Режимы открытия файла представляют собой битовые маски, поэтому можно задавать два или более режима, объединяя их побитовой операцией ИЛИ. В следующем фрагменте кода файл открывается для вывода с помощью функции open():

    ofstream fs;

    ofs.open("filename.dat");

Обратим внимание, что по умолчанию режим открытия файла соответствует типу файлового потока. У потока ввода или вывода флаг режима всегда установлен неявно. Например, для потока вывода в режиме добавления файла можно вместо оператора

ofstream ofs( "fname.txt", ios::out | ios::app );

написать 
    

  ofstream ofs( "fname.txt", ios::app );

Между режимами открытия файла ios::ate и ios::app имеется небольшая разница.

Если файл открывается в режиме добавления, весь вывод в файл будет осуществляться в позицию, начинающуюся с текущего конца файла, безотносительно к операциям позиционирования в файле. В режиме открытия ios::ate (от английского "at end") можно изменить позицию вывода в файл и осуществлять запись, начиная с нее. Для потоков вывода режим открытия эквивалентен ios::out | ios::trunc, то есть можно опустить режим усечения файла. Однако для потоков ввода-вывода его нужно указывать явно. Файлы, которые открываются для вывода, создаются, если они еще не существуют.

Если открытие файла завершилось неудачей, объект, соответствующий потоку, будет возвращать 0:

if ( ! ofs )

{

cout << "Файл не открыт\n";

 }

Проверить успешность открытия файла можно также с помощью функции-члена is_open(), имеющей следующий прототип:

int is_open() const;

Функция возвращает 1, если поток удалось связать с открытым файлом. Например,

if ( ! ofs.is_open() )

{

cout << "Файл не открыт\n";

return;

}

Если при открытии файла не указан режим ios::binary, файл открывается в текстовом режиме и после того, как файл успешно открыт, для выполнения операций ввода-вывода можно использовать операторы извлечения и вставки в поток. Для проверки, достигнут ли конец файла, можно использовать функцию ios::eof(), имеющую прототип int eof();

Завершив операции ввода-вывода, необходимо закрыть файл, вызвав функцию-член close() с прототипом void close():

ofs.close();

Закрытие файла происходит автоматически при выходе потокового объекта из области существования.

Рассмотрим пример, демонстрирующий файловый ввод-вывод с использованием потоков:

#include <fstream>

#include <iostream>

using namespace std;

void main()

{

 int n = 50;

 // Открываем файл для вывода

 ofstream ofs( "test.txt" );

 if ( ! ofs )

 {

 cout << "Файл не открыт.\n";

 return;

}

 

ofs << "Hello!\n" << n;

 // Закрываем файл

ofs.close();

 // открываем тот же файл для ввода

 ifstream file("Test.txt");

 if ( ! file )

 {

 cout << "Файл не открыт.\n";

 return;

}

 char str[128];

file >> str >> n;

 cout << str << " " << n << endl;

 // Закрываем файл

file.close();

}


 

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

34697. Общие, средние и предельные издержки фирмы 17.64 KB
  Общие средние и предельные издержки фирмы. Экономисты различают общие средние и предельные издержки. Общие издержки ТC – это издержки всего выпуска продукта фирмы. Общие издержки делятся на постоянные и переменные издержки.
34698. Типы экономических систем. Традиционная экономическая система 19.1 KB
  Традиционная экономическая система. Экономическая наука выделяет четыре основных типа экономических систем: традиционная командная или административноплановая рыночная смешанная. Самой древней из экономических систем является традиционная система. Традиционная экономическая система – способ организации экономической жизни при котором земля и капитал находятся в общем владении племени а ограниченные ресурсы распределяются в соответствии с длительно существующими традициями.
34699. Административно-плановая (командная) экономическая система 23.83 KB
  Административноплановая командная экономическая система существовала в СССР. Это объяснялось тем что в городах практически отсутствовало жилье для вновь прибывших и тем что в соответствии с законом СССР было очень сложно получить постоянную прописку в данном городе. Высшим плановым органом являлся Госплан СССР. Госплан СССР определял плановые задания республиканским и местным плановым органам а также плановым отделам министерств и ведомств которые давали плановые задания государственным предприятиям то есть указывали им...
34700. Монополия. Монопольная власть. Условия максимизации прибыли при монополии. Ценовая дискриминация 17.8 KB
  Монополия. Монополия – тип рыночной системы в котором существует только один продавец контролирующий всю отрасль производства определенного товара не имеющего близкого заменителя. Закрытая монополия. Естественная монополия – отрасль в которой долгосрочные средние издержки минимальны только тогда когда одна фирма обслуживает весь рынок целиком.
34701. Экономическая рента 16.61 KB
  Рассмотрим понятие экономической ренты на примере рынка труда где экономическая рента равна разности между фактической ценой труда и тем ее уровнем который достаточно для того чтобы привлечь работника трудиться по данной профессии рисунок1 Ставка зарплаты в час W1 Е S А D L1 Колво чел.L 0 1 2 3 4 5 Допустим что...
34702. Коммерческие банки. Центральный банк 17.35 KB
  Поэтому все частные банки называют коммерческими банками в отличие от Центрального банка. Операции любого банка подразделяются на пассивные и активные. Создание коммерческого банка начинается с того что его владелец – акционерное общество – должен инвестировать сложить собственные деньги в кассу банка деньги в строительство здания в оборудование сейфы и др. Чем выше процентная ставка по вкладу тем больше вкладчиков у банка.
34703. Бухгалтерские издержки и прибыль 20.08 KB
  Бухгалтерские издержки и прибыль. Экономические издержки и прибыль. Издержки производства по–разному определяются бухгалтером и экономистом. Бухгалтер определяет издержки чтобы установить во что обошлось фирме производство продукции.
34704. Рынок и его функции. Виды рынков. Рыночная экономическая система 22.68 KB
  Рынок и его функции. Для домашней хозяйки рынок – это городской базар или магазин. Поэтому рынок – это форма контактов между продавцами и покупателями товаров и услуг недвижимости ценных бумаг и валюты. Таким образом рынок выполняет информационную функцию то есть через постоянно меняющиеся цены рынок сообщает производителям где и какой продукции не хватает где и какая продукция произведена с избытком.
34705. Смешанная экономическая система 16.52 KB
  СМЕШАННАЯ ЭКОНОМИКА это рыночная система основанная на частной собственности и свободном предпринимательстве регулируемая государством. В смешанной экономике активную роль играет государство. Государство вырабатывает правила игры создает законы которые должны обеспечить всем участникам хозяйственной деятельности равные права: государство ведет борьбу с недобросовестной конкуренцией контролирует деятельность фирм с целью недопущения незаконных финансовых операций и нарушения прав потребителей защищает от злоупотребления крупными...