Опубликован: 02.02.2011 | Уровень: для всех | Доступ: платный
Лекция 21:

Обработка файлов в потоковом режиме

< Лекция 20 || Лекция 21: 12 || Лекция 22 >
Аннотация: В лекции рассматриваются понятие потокового режима при работе с файлами, потоки как типы данных, библиотечные функции ввода-вывода в потоковом режиме, примеры решения задач на обработку данных из файлов.

Цель лекции: изучить организацию потокового ввода-вывода в файлы, научиться решать задачи с использованием прямого доступа к данным файла на языке C++.

Для работы с файлами используются специальные типы данных, называемые потоками.

Поток ifstream служит для работы с файлами в режиме чтения.

Поток ofstream служит для работы с файлами в режиме записи.

Поток fstream служит для работы с файлами в режиме как чтения, так и записи.

В программах на C++ при работе с текстовыми файлами в потоковом режиме необходимо подключать библиотеки iostream и fstream.

Функция открытия файла

Для того чтобы начать работать с текстовым файлом, необходимо описать переменную типа ofstream.

Например, с помощью оператора

ofstream F;

будет создана переменная F для записи информации в файл.

На следующем этапе файл необходимо открыть для записи. В общем случае оператор открытия файла будет иметь вид:

F.open("file", mode);

где Fпеременная, описанная как ofstream;

fileполное имя файла на диске;

mode – режим работы с открываемым файлом.

Существуют следующие режимы для открытия файла.

Режимы работы с файлом при открытии
Режим Описание
ios::in открыть файл в режиме чтения данных, этот режим является режимом по умолчанию для потоков ifstream
ios::out открыть файл в режиме записи данных, этот режим является режимом по умолчанию для потоков ofstream
ios::app открыть файл в режиме записи данных в конец файла
ios::ate передвинуться в конец уже открытого файла
ios::trunc очистить файл, это же происходит в режиме ios::out
ios::nocreate не выполнять операцию открытия файла, если он не существует
ios::noreplace не открывать существующий файл
ios::binary открыть двоичный файл

Параметр mode может отсутствовать, в этом случае файл открывается в режиме по умолчанию для данного потока:

ios::in – для потоков ifstream,

ios::out – для потоков ofstream.

После удачного открытия файла (в любом режиме) в переменной F будет храниться 1 (true), в противном случае 0 (false). Это позволит проверять корректность операции открытия файла.

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

if (!ofs){ 
  cout << "Файл не открыт\n";
  }

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

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

if (!ofs.is_open()) 
  cout << "Файл не открыт\n";

Открыть файл в режиме записи можно одним из следующих способов:

Первый способ

ofstream F;
F.open("abc.txt", ios::out);

Второй способ, режим ios::out является режимом по умолчанию для потока ofstream

ofstream F;
F.open("abc.txt");

Третий способ объединяет описание переменной типа поток и открытие файла в одном операторе.

ofstream F("abc.txt", ios::out);

После открытия файла в режиме записи, будет создан пустой файл, в который можно будет записывать информацию. Если необходимо открыть существующий файл (при этом сохранить его содержимое), то в качестве режима следует использовать значение ios::app.

После открытия файла в режиме записи, в него можно писать точно так же, как и на экран, только вместо стандартного устройства вывода cout необходимо указать имя открытого для записи файла.

Например, для записи в поток F переменной a, оператор вывода будет иметь вид:

F << a;

Для последовательного вывода в поток G переменных b, c и d оператор вывода станет таким:

G << b << c << d;

Чтение из файла выполняется корректно до достижения конца файла. Для проверки, достигнут ли конец файла, можно использовать функцию

ios::eof(),

которая имеет прототип int eof();.

Данная функция возвращает 0, если конец файла не достигнут, и значение 1 при достижении конца файла.

Функция закрытия файла

Открытые на диске файлы после окончания работы с ними рекомендуется закрыть. Оператор закрытия файла будет иметь вид:

F.close;

где Fпеременная для записи информации в файл.

Основные алгоритмы работы с файлами

Для записи данных в файл нужно выполнить:

  1. Описать переменную типа ofstream.
  2. Открыть файл для записи с помощью функции open.
  3. Вывести информацию в файл с помощью cout.
  4. Обязательно закрыть файл.

Для чтения данных из текстового файла нужно выполнить:

  1. Описать переменную типа ifstream.
  2. Открыть файл для чтения с помощью функции open.
  3. Считать информацию из файла с помощью cin при считывании каждой порции данных необходимо проверять, что чтение возможно.
  4. Закрыть файл.

Пример. Работа с файлом в потоковом режиме.

#include "stdafx.h"
#include <iostream>
using namespace std;
#include <fstream>
int _tmain(int argc, _TCHAR* argv[]){
  int n = 50; 
  char str[20];
  // Открываем файл для вывода 
  ofstream ofs("Test.txt"); 
  // Проверка корректности открытия файла
  if (!ofs) cout << "Файл не открыт.\n"; 
   else {
     ofs << "Hello!\n" << n; 
  // Закрываем файл 
     ofs.close(); 
      }
  // Открываем тот же файл для ввода 
  ifstream file("Test.txt"); 
  // Проверка корректности открытия файла
  if (!file) cout << "Файл не открыт.\n"; 
   else {
    file >> str >> n; 
    cout << str << "\n" << n; 
  // Закрываем файл 
    file.close();       
       }
  system("pause");
  return 0;
}

Ключевые термины

Поток fstream – это поток для работы с файлами в режиме, как чтения, так и записи.

Поток ifstream – это поток для работы с файлами в режиме чтения.

Поток ofstream – это поток для работы с файлами в режиме записи.

Поток как тип данных – это тип, который описывает объекты, реализующие процесс ввода и вывода данных в файлы.

Режимы открытия файлов – это наборы допустимых действий с открываемыми в программе файлами.

Краткие итоги

  1. В С++ определен специальный тип данных – поток.
  2. Каждый из потоков: fstream, ifstream, ofstream – служит для работы с файлами в определенном режиме.
  3. Прототипы функций по работе с файлами в потоковом режиме находятся в стандартных библиотеках.
  4. Перед началом работы с файлом его необходимо открыть, указав режим открытия.
  5. Любой открытый в программе файл необходимо закрыть после использования.
< Лекция 20 || Лекция 21: 12 || Лекция 22 >
Денис Курбатов
Денис Курбатов
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Ольга Замятина
Ольга Замятина
Россия, Калиниград, РГУ им. И. Канта, 2009
Эдуард Санин
Эдуард Санин
Украина, Харьков, ХАИ