4872

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

Лекция

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

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

Русский

2012-11-28

54.5 KB

8 чел.

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

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

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

Для осуществления операций с файлами предусмотрено три особых типа данных (класса): 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();

}


 

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

44145. Телевидение 80х – 90х: проблемы и перспективы развития 370.5 KB
  В последние годы жизни Влада Листьева называли самой яркой звездой отечественного телевидения. Вопросы перестройки заняли одно из главных мест и в передачах телевидения. В правительстве был подготовлен пакет документов который должен обеспечить реализацию на практике новых условий работы печати радио телевидения и издательств. Для многих он до сих пор остается символом нового телевидения.
44146. Определение потребной мощности холодильного оборудования РПС 821.5 KB
  Наибольшее распространение для холодильной обработки пищевых продуктов получили паровые компрессионные холодильные машины с одноступенчатым и двухступенчатым сжатием паров холодильного агента. Для построения теоретического и действительного циклов работы паровой холодильной машины необходимо выбрать
44147. Разработка визуальной системы обучения основам алгоритмизации и программирования курсантов высших военных учебных заведений 2.9 MB
  Целью изучения учебной дисциплины «Информатика и программирование» является приобретение курсантами базовых знаний и практических навыков, позволяющих эффективно применять средства автоматизации управления внутренними войсками для решения служебно-боевых задач в сфере военно-профессиональной деятельности по специальности
44148. Исследование физической подготовленности легкоатлетов групп начальной подготовки 254.5 KB
  Средства и методы обучения и тренировки легкоатлетов Структура и содержание спортивной тренировки на этапе начальной подготовки Оценить динамику физической подготовленности занимающихся в секции легкой атлетики в годичном цикле тренировки. Систематичность последовательность и постепенность лежат в основе планирования спортивной тренировки в легкой атлетике и осуществляются в недельном месячном годичном тренировочных циклах предполагая систематическое последовательное но постепенное повышение тренировочных нагрузок...
44149. Направления повышения экономической безопасности предприятия ООО «Дорожно-строительное предприятие» 648.5 KB
  Теоретико-методические положения обеспечения экономической безопасности предприятия. Сущность экономических подходов к повышению уровня безопасности предприятия. Методические положения по определению уровня экономической безопасности предприятия и факторов на нее влияющих. Методы повышения экономической безопасности предприятия.
44150. Реклама вентиляционных систем стандартные и нестандартные решения (на примере компании «Формик») 1.51 MB
  Большинство современных рынков подразделяют на множество сегментов. Многие товары и услуги имеют узкую нишу и ограниченный круг потребителей, охватить который с помощью традиционной рекламы сложно и затратно. Все равно, что бить из пушки по воробьям.
44151. Аграрная политика государства в условиях рынка 695.5 KB
  В связи с этим появились суждения о том что система колхозов способствовала развалу сельского хозяйства и лишь с ликвидацией такой системы наступит всеобщее благоденствие. Поэтому налицо отчуждение работника сельского хозяйства от земли спад интереса к сельскохозяйственному труду многие деревни опустели. Трудности развития сельского хозяйства и других отраслей АПК как показывают реформы с каждым годом только увеличиваются. Учитывая данные обстоятельства решение проблемы продовольственной безопасности страны должно представлять собой...
44152. Техническое обслуживание и ремонт электропривода ЭПЦ-1000 Д12УХЛ 340.1 KB
  Предназначен для управления рабочими органами запорной арматуры технологических и магистральных трубопроводов на объектах МН: линейной части нефтепровода, НПС (ЛПДС), нефтебаз, пунктов слива-налива, резервуарных парков, морских терминалов, а также регулирующих органов в системах автоматического регулирования давления на НПС (ЛПДС) и линейной части, трубопроводной запорной арматуры систем пожаротушения, водоснабжения и канализации, водяного охлаждения, клапанов систем автоматики отопления и вентиляции
44153. РАЗРАБОТКА МАРКЕТИНГОВОГО ПЛАНА УЧАСТИЯ В ВЫСТАВКЕ (НА ПРИМЕРЕ ООО «СЦ «СЭР», Г. ЛЕНИНСК-КУЗНЕЦКИЙ) 1.2 MB
  Целью работы является разработка плана участия в выставке для совершенствования деятельности предприятия на примере ООО Сервисный Центр СибЭнергоРесурс. Четвертая глава направлена на разработку маркетингового плана участия в выставке для ООО Сервисный Центр СибЭнергоРесурс.3 Разработка маркетингового плана участия в выставке.