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

}


 

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

76923. Среднее ухо 180.75 KB
  Слуховые косточки лежат в барабанной полости связанные между собой и некоторыми стенками суставами мышцами и мембранами. Кроме того существует костная проводимость звука через слуховые косточки и стенки барабанной полости. Стенки барабанной полости: верхняя покрышечная стенка – на передней поверхности пирамиды височной кости; нижняя яремная стенка в области яремной ямки на нижней поверхности пирамиды с началом сосцевидного канальца для ушной ветви X пары; медиальная лабиринтная стенка с мысом окном преддверия овальным...
76924. Внутреннее ухо: костный и перепончатый лабиринты. Спиральный (кортиев) орган. Проводящий путь слухового анализатора 184.04 KB
  Они представлены волосковыми сенсорноэпителиальными клетками которые находятся внутри улитки в спиральном органе слуховой рецептор и внутри расширений преддверия и полукружных каналов вестибулярный рецептор. Костный и перепончатый лабиринт – скелет внутреннего уха располагается в пирамиде височной кости имеет следующие составные части: преддверие занимающее срединное положение; улитку лежащую кпереди от преддверия; три полукружных канала расположенных кзади от преддверия. Стенки отверстия и другие образования преддверия...
76925. Орган зрения: общий план строения. Глазное яблоко и его вспомогательный аппарат 183.74 KB
  Изменения внутренней оси глаза короткая длинная сказываются на положении фокуса световых лучей. Оболочки глаза состоят: из фиброзной оболочки с прозрачной и круглой передней частью роговицей диаметром в 12 мм толщиной в 1 мм; и с задней частью плотной белесоватой склерой толщиной от 04 до 1 мм; из сосудистой оболочки с тремя частями: собственно сосудистой ресничным телом радужкой со зрачком; из сетчатой оболочки с наружной пигментной и внутренней светочувствительной частью. Внутреннее ядро глаза представлено водянистой влагой...
76926. Преломляющие среды глазного яблока: роговица, жидкость камер глаза, хрусталик, стекловидное тело 181.53 KB
  Стекловидное тело находится в стекловидной камере. Объем его у взрослого - 4 мл. По составу - это гелеобразная среда с наличием в остове особых белков: витрозина и муцина, с которыми связана гиалуроновая кислота, что обеспечивает вязкость и упругость тела
76927. Сосудистая оболочка глаза, ее части. Механизм аккомодации 180.92 KB
  Ресничное тело средний отдел сосудистой оболочки расположен в виде кругового валика соответственно месту перехода роговицы в склеру сзади от радужки с которой срастается наружным ресничным краем. В центре радужка имеет зрачок ограниченный зрачковым краем сосудистой оболочки а противоположный ему край называется ресничным. В сосудистой оболочке находятся ресничные артерии: задние и передние; короткие и длинные. Из венозной сети сосудистой оболочки формируются вортикозные вены 46 проходящие через склеру и впадающие в...
76928. Сетчатая оболочка глаза. Проводящий путь зрительного анализатора 181.61 KB
  Внутренняя или сетчатая оболочка глаза плотно срастается с сосудистой по всей площади соприкосновения. Центральная ямка макулы сосредотачивает только колбочковые нейросенсорные клетки и в нее ldquo;упираетсяrdquo; оптическая ось глаза. Проводящий зрительный путь Рецепторное поле это сетчатая оболочка глаза с палочко и колбочковидными клетками содержащими светочувствительный пигмент родопсин йодопсин.
76929. Вспомогательный аппарат глазного яблока 179.9 KB
  Чувствительная иннервация осуществляется за счет глазничной ветви тройничного нерва при помощи: длинных ресничных ветвей из носоресничного нерва и подглазничного нерва от второй ветви пятой пары. Иннервация мышц происходит из глазодвигательного нерва: прямые мышцы верхняя нижняя медиальная нижняя косая подниматель верхнего века. Из отводящего нерва снабжается прямая латеральная мышца; из блокового верхняя косая; из лицевого нерва круговая мышца глаза. Их топография строение кровоснабжение иннервация.
76930. Органы вкуса и обоняния 180.85 KB
  Во вкусовых почках передних 2 3 третей языка обнаружен сладко чувствительный белок а в задней части – горько чувствительный. Вкусовые вещества адсорбируются микроворсинками вкусовых сенсорных эпителиоцитов и в них сталкиваются с рецепторными белками клетки что изменяет проницаемость мембран вкусовых эпителиоцитов и генерирует импульс. На боковых поверхностях вкусовых клеток замыкаются: в области передних 2 3 языка терминали барабанной струны промежуточного нерва – VII черепной пары; на задней 1 3 языка и слизистой неба и глотки ...
76931. Анатомия кожи и ее производных. Молочная железа: топография, строение, кровоснабжение, иннервация 191.33 KB
  В нем залегают корни волос потовые и сальные железы лимфоидные узелки иммунной системы. В сумку открывается проток сальной железы. Потовые glndule sudorifere это простые трубчатые железы в количестве 225 млн. По строению и функции потовые железы делятся на мерокриновые и апокриновые.