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();

}


 

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

81423. Основы функционирования белков. Активный центр белков и его специфическое взаимодействие с лигандом как основа биологической функции всех белков. Комплементарность взаимодействия молекул белка с лигандом. Обратимость связывания 102.95 KB
  Активный центр белков и его специфическое взаимодействие с лигандом как основа биологической функции всех белков. Каждый индивидуальный белок имеющий уникальную первичную структуру и конформацию обладает и уникальной функцией отличающей его от остальных белков. Набор индивидуальных белков выполняет в клетке множество разнообразных и сложных функций.
81424. Доменная структура и её роль в функционировании белков. Яды и лекарства как ингибиторы белков 106.19 KB
  Яды и лекарства как ингибиторы белков. Некоторые яды попадая в организм человека прочно связываются с определёнными белками ингибируют их и тем самым вызывают нарушения биологических функций. Так лекарства назначаемые в дозах больших чем терапевтические могут действовать как яды т. вызывать серьёзные нарушения обмена веществ и функций организма а яды в микродозах часто используют как лекарственные препараты.
81425. Четвертичная структура белков. Особенности строения и функционирования олигомерных белков на примере гемсодержащего белка - гемоглобина 104.92 KB
  Особенности строения и функционирования олигомерных белков на примере гемсодержащего белка гемоглобина. В частности молекула гемоглобина состоит из двух одинаковых α и двух βполипептидных цепей т. Молекула гемоглобина содержит четыре полипептидные цепи каждая из которых окружает группу гема – пигмента придающего крови ее характерный красный цвет. Простетическая группа нековалентно связана с гидрофобной впадиной молекулы гемоглобина.
81426. Лабильность пространственной структуры белков и их денатурация. Факторы, вызывающие денатурацию 100.13 KB
  Под лабильностью пространственной структуры белка понимают способность структуры белковой молекулы претерпевать конформационные изменения под действием различных физикохимических факторов. Под денатурацией следует понимать нарушение общего плана уникальной структуры нативной молекулы белка преимущественно ее третичной структуры приводящее к потере характерных для нее свойств растворимость электрофоретическая подвижность биологическая активность и т. При непродолжительном действии и быстром удалении денатурирующих агентов возможна...
81427. Шапероны - класс белков, защищающий другие белки от денатурации в условиях клетки и облегчающий формирование их нативной конформации 105.78 KB
  Шаперо́ны (англ. chaperones) — класс белков, главная функция которых состоит в восстановлении правильной третичной структуры повреждённых белков, а также образование и диссоциация белковых комплексов. Термин «молекулярный шаперон» впервые был использован в работе Ласкей и других при описании ядерного белка нуклеоплазмина
81428. Многообразие белков. Глобулярные и фибриллярные белки, простые и сложные. Классификация белков по их биологическим функциям и по семействам: (сериновые протеазы, иммуноглобулины) 106.76 KB
  Глобулярные и фибриллярные белки простые и сложные. Так белки можно классифицировать: по форме молекул глобулярные или фибриллярные; по молекулярной массе низкомолекулярные высокомолекулярные и др.; по химическому строению наличие или отсутствие небелковой части; по выполняемым функциям транспортные защитные структурные белки и др.; по локализации в организме белки крови печени сердца и др.
81429. Иммуноглобулины, особенности строения, избирательность взаимодействия с антигеном. Многообразие антигенсвязывающих участков Н- и L-цепей. Классы иммуноглобулинов, особенности строения и функционирования 108.05 KB
  Домены тяжёлых цепей IgG имеют гомологичное строение с доменами лёгких цепей. Специфичность пути разрушения комплекса антигенантитело зависит от класса антител которых существует 5 типов: Ig IgD IgE IgG IgM. Созревающие Влимфоциты синтезируют мономерные бивалентные молекулы IgM по структуре похожие на рассматриваемые выше IgG которые встраиваются в плазматическую мембрану клеток и играют роль первых антигенраспознающих рецепторов. В количественном отношении IgG доминируют в крови и составляют около 75 от общего количества этих...
81430. Физико-химические свойства белков. Молекулярный вес, размеры и форма, растворимость, ионизация, гидратация 103.82 KB
  Молекулярный вес размеры и форма растворимость ионизация гидратация Индивидуальные белки различаются по своим физикохимическим свойствам: форме молекул молекулярной массе суммарному заряду молекулы соотношению полярных и неполярных групп на поверхности нативной молекулы белка растворимости белков а также степени устойчивости к воздействию денатурирующих агентов. Различия белков по молекулярной массе. Молекулярная масса белка зависит от количества аминокислотных остатков в полипептидной цепи а для олигомерных белков и от...
81431. Методы выделения индивидуальных белков: осаждение солями и органическими растворителями, гель-фильтрация, электрофорез, ионообменная и аффинная хроматография 104.42 KB
  Метод выделения белков основанный на различиях в их растворимости при разной концентрации соли в растворе. Соли щелочных и щёлочноземельных металлов вызывают обратимое осаждение белков т. Чаще всего для разделения белков методом высаливания используют разные концентрации солей сульфата аммония NH42SO4.