Структуры и алгоритмы компьютерной обработки данных

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

Показывать лекцию целиком

Цель лекции: изучить организацию потокового ввода-вывода в файлы, научиться решать задачи с использованием прямого доступа к данным файла на языке 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 – переменная для записи информации в файл.

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

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

  • Описать переменную типа ofstream.
  • Открыть файл для записи с помощью функции open.
  • Вывести информацию в файл с помощью cout.
  • Обязательно закрыть файл.
  • Для чтения данных из текстового файла нужно выполнить:

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

    #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 – это поток для работы с файлами в режиме записи.

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

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

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

  • В С++ определен специальный тип данных – поток.
  • Каждый из потоков: fstream, ifstream, ofstream – служит для работы с файлами в определенном режиме.
  • Прототипы функций по работе с файлами в потоковом режиме находятся в стандартных библиотеках.
  • Перед началом работы с файлом его необходимо открыть, указав режим открытия.
  • Любой открытый в программе файл необходимо закрыть после использования.
  • Лабораторная работа 20. Обработка файлов в потоковом режиме

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

    При выполнении лабораторной работы для каждого задания требуется написать программу на языке С++, которая получает на входе одну строковую величину, являющуюся корректным именем входного файла (при этом в программе следует предусмотреть проверку существования и корректности открытия файла). Ввод данных осуществляется из входного файла в потоковом режиме с учетом требований к входным данным, содержащихся в постановке задачи. Ограничениями на входные данные является максимальный размер строковых данных и допустимый диапазон числовых типов в языке С++. При некорректном открытии файла программа должна завершить работу с выдачей на экран соответствующего сообщения.

    Теоретические сведения.

    Ознакомьтесь с материалом лекции 20.

    Задания к лабораторной работе.

    При выполнении заданий используйте работу с файлами с помощью потоков.

  • Определите, какая буква чаще всего встречается в заданном текстовом файле.
  • Удвойте в текстовом файле каждый символ, кроме пробела.
  • Подсчитайте число цифр в данном текстовом файле и их сумму.
  • Найдите в файле все строки с максимальной длиной. Выведите их на экран и укажите длину. Выполните чтение их входного файла только один раз.
  • Определите переменную "студент", содержащую следующие поля: имя, фамилия, отчество студента, название института, курс, номер группы, специальность. Данные считайте из текстового файла. Выведите данные о студентах, которые учатся на одинаковом курсе и по одной специальности. Курс и специальность задаются пользователем.
  • Указания к выполнению работы.

    Каждое задание необходимо решить в соответствии с изученными методами обработки файлов в потоковом режиме в языке С++. В программном коде к каждой задаче следует выполнять чтение данных из существующего входного файла (имя файла вводится в виде строки символов и считается корректным с точки зрения организации файловой системы). В задаче 2 возможно использование вспомогательного файла, который выступает в роли выходного файла. Программу для решения каждого задания необходимо разработать методом процедурной абстракции, оформив комментарии к коду.

    Следует реализовать каждое задание в соответствии с приведенными этапами:

  • изучить словесную постановку задачи, выделив при этом все виды данных;
  • сформулировать математическую постановку задачи;
  • выбрать метод решения задачи, если это необходимо;
  • разработать графическую схему алгоритма;
  • записать разработанный алгоритм на языке С++;
  • разработать контрольный тест к программе;
  • отладить программу;
  • представить отчет по работе.
  • Требования к отчету.

    Отчет по лабораторной работе должен соответствовать следующей структуре.

  • Титульный лист.
  • Словесная постановка задачи. В этом подразделе проводится полное описание задачи. Описывается суть задачи, анализ входящих в нее физических величин, область их допустимых значений, единицы их измерения, возможные ограничения, анализ условий при которых задача имеет решение (не имеет решения), анализ ожидаемых результатов.
  • Математическая модель. В этом подразделе вводятся математические описания физических величин и математическое описание их взаимодействий. Цель подраздела – представить решаемую задачу в математической формулировке.
  • Алгоритм решения задачи. В подразделе описывается разработка структуры алгоритма, обосновывается абстракция данных, задача разбивается на подзадачи. Схема алгоритма выполняется по ЕСПД (ГОСТ 19.003-80 и ГОСТ 19.002-80).
  • Листинг программы. Подраздел должен содержать текст программы на языке программирования С++, реализованный в среде MS Visual Studio 2010.
  • Контрольный тест. Подраздел содержит наборы исходных данных и полученные в ходе выполнения программы результаты.
  • Выводы по лабораторной работе.
  • Ответы на контрольные вопросы.
  • Контрольные вопросы

  • Почему ввод-вывод в файлы в потоковом режиме аналогичен работе с другими устройствами ввода-вывода?
  • С какой целью предусмотрены режимы открытия файлов и почему их такое многообразие?
  • Каковы могут быть причины ошибок при открытии файлов в потоковом режиме?
  • Какие значения возвращает функция открытия файла в потоковом режиме в зависимости от результата?
  • Каким образом в программе происходит проверка достижения конца файла?
  • Может ли один и тот же файл одновременно быть открыт для чтения и для записи?
  • Можно ли один и тот же файл открыть несколько раз, не закрывая после каждого открытия?
  • Сохранится ли информация в файле, если его не закрыть в программе с помощью функции? Обоснуйте ответ.
  • В чем принципиальное отличие ввода-вывода в файлы при потоковом и стандартном режимах?
  • Вернуться к учебному плану