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

}


 

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

15688. СОЦИАЛЬНО-КУЛЬТУРНОЕ ВОЗДЕЙСТВИЕ МАССОВОЙ КОММУНИКАЦИИ: ПОЛИТИЧЕСКИЕ АСПЕКТЫ 926 KB
  СОЦИАЛЬНОКУЛЬТУРНОЕ ВОЗДЕЙСТВИЕ МАССОВОЙ КОММУНИКАЦИИ: ПОЛИТИЧЕСКИЕ АСПЕКТЫ ИССЛЕДОВАНИЕ ОПЫТА ЗАПАДА АННОТАЦИЯ Книга представляет собой электронную версию книги В.П. Терина МАССОВАЯ КОММУНИКАЦИЯ. ИССЛЕДОВАНИЕ ОПЫТА ЗАПАДА М. 2000. Духовная жизнь стран Зап...
15689. Основы воздействия СМИ 3.74 MB
  Основы воздействия СМИ Книга посвящена воздействию которое оказывают средства массовой информации на зрителей и слушателей. Авторы дают краткий исторический обзор темы анализируют феномен воздействия СМИ на массовую аудиторию и научные исследования данного явлени
15690. СМИ в структуре общения 82.5 KB
  Средства массовых коммуникаций как специфический фактор общения. В структуре общения как информационном процессе массовые коммуникации и их специфические средства занимают важное место. Как отмечает Б.Парыгин известные современному обществу средства массовых ко...
15691. МЕСТО ТЕЛЕВИДЕНИЯ В СИСТЕМЕ СРЕДСТВ МАССОВОЙ КОММУНИКАЦИИ 341 KB
  МЕСТО ТЕЛЕВИДЕНИЯ В СИСТЕМЕ СРЕДСТВ МАССОВОЙ КОММУНИКАЦИИ Кинематограф прямой предшественник телевидения Он начинался с того что снимал саму жизнь: происходящее на улице на дороге на вокзале то что сегодня мы назвали бы документальным фильмом. Художественный ф...
15692. Функции СМИ в жизни общества 68 KB
  Функции СМИ в жизни общества 1. Информационная функция Все средства массовой информации потому и называются так что первым и главным их качеством была способность удовлетворить информационные потребности индивида общества государства. Телевидение распространяет...
15693. Психология массовых коммуникаций 2.48 MB
  Харрис Р. Психология массовых коммуникаций. 4е международное издание СОДЕРЖАНИЕ Предисловие Глава Средства массовой информации в обществе: учебное пособие для нашей жизни Глава Практика и теория массовой коммуник...
15694. Право. 10–11 класс. Базовый и углублённый уровни 1.84 MB
  Учебник содержит материал о ключевых вопросах истории и теории права и государства, в нем рассмотрены система и важнейшие отрасли российского права – конституционное, гражданское, семейное, трудовое, уголовное и др. Основной текст учебника дополняют интересные факты, сведения, документы. Развернутый методический аппарат включает вопросы для самоконтроля, темы для проектов, рефератов и обсуждения, рубрики «Это интересно», «Информация к размышлению», «Исследуем документы и материалы».
15695. Символизм как миропонимание 112 KB
  Еще недавно думали мир изучен. Всякая глубина исчезла с горизонта. Простиралась великая плоскость. Не стало вечных ценностей открывавших перспективы. Все обесценилось. Но не исчезло стремление к дальнему в сердцах. Захотелось перспективы. Опять запросило сердце вечны
15696. Публицистская деятельность А. Блока в журнале Золотое руно 37.5 KB
  Публицистская деятельность А. Блока в журнале Золотое руно Блок активно включается в литературную повседневность публикуется во всех символистских журналах – Весы Золотое руно; в газетах – Слово Речь; в альманахах. Золотое руно – ежемесячный художествен...