Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Основы файлового ввода-вывода



Для реализации файлового ввода-вывода, необходимо включить в программу заголовочный файл fstream.h. В нем определено несколько классов, включая ifstream, ofstream, fsream. Эти классы являются производными классов istream, ostream. Классы istream, ostream производные класса ios, поэтому ifstream, ofstream, fsream также имеют доступ ко всем операциям, определяемым в классе ios.

Файл открывается при связывании его с потоком. Имеется три типа потоков: входной, выходной и входной/выходной. Перед тем как открыть файл, нужно, во-первых, создать поток. Для создания входного потока необходимо объявить поток класса ifstream. Для создания выходного - объявить поток класса ofstream. Потоки, которые реализуют и ввод, и вывод, должны объявляться как объекты класса fstream. Например, в следующем фрагменте создается один входной поток, один выходной поток и один поток для ввода и вывода:

ifstream in; // ввод

ofstreaiv; cut; // вывод

fstream io; // ввод и вывод

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

void open (char * filename, int mode, int access);

Здесь filename — имя файла, в который можно включить путь. Величина mode задает способ открытия файла. Способ определяется следующими значениями, наследуемыми классом fstream: ios:: app, ios:: ate, ios:: binary, ios:: in, ios:: nocreate, ios:: noreplace, ios:: out, ios:: trunk.

Для объединения двух и более значений используется оператор OR. Рассмотрим, что означает каждое из этих значений.

Метод ios::app вызывает открытие файла в режиме добавления в конец файла.

Значение ios::binary вызывает открытие файла в двоичном режиме. По умолчанию, все файлы открываются в текстовом режиме.

Режим ios::in определяет открытие файла для ввода. Флаг ios::out показывает, что файл открывается для вывода. Создание потока с использованием ifstream обеспечивает ввод, а создание потока с использованием ofstream обеспечивает вывод, поэтому, в таких случаях, указанные величины использовать необязательно.

Использование ios::nocreate приводит к тому, что функция ореп() возвращает ошибку, если файла до сих пор не существует. Использование ios::noreplace приводит к тому, что функция ореп() возвращает ошибку, если файл уже существует.

Использование ios::trunc приводит к удалению содержимого ранее существовавшего файла с тем же названием и усечению его до нулевой длины.

Параметр access задает права доступа к файлу. По умолчанию для DOS/Windows значение access равно 0. Коды представлены в следующей таблице:

Атрибут Значение
  обычный файл со свободным доступом
  файл только для чтения
  скрытый файл
  системный файл
  архивный файл

В следующем фрагменте открывается обычный выходной файл в среде DOS/Windows:

ofstream out;

out.open (" test ", iоs:: out, 0);

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

out.open("test"); // по умолчанию для обычного выходного файла

Чтобы открыть поток для ввода и вывода, необходимо задать для mode оба значения: ios::in и ios::out, как показано в следующем примере. (Здесь значение по умолчанию для mode не задается.)

fstream mystream;

mystream.open ("test", ios::in | ios::out);

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

if (!mystream)

{ cout << "Файл открыть невозможнo\n";

// ошибка открытия файла

}

Классы ifstream, ofstream и fstream содержат конструкторы, которые открывают файл автоматически. Конструкторы имеют те же параметры, что и функция ореп(). Поэтому чаше вы будете пользоваться таким способом открытия файла:

ifstream mystream ("myfile"); // открытие файла ввода

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

Для закрытия файла используйте функцию-член close(). Например, чтобы закрыть файл, связанный с потоком mystream, пользуйтесь таким оператором:

mystream. close ();

Функция close() не имеет параметров и возвращаемого значения.

Используя функцию-член eof(), можно определить, был ли, достигнут конец файла при вводе. Прототип этой функции: int eof();

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

После того как файл открыт, очень легко считать или записать в него текстовые данные. Просто используйте операторы << и >> так же, как это делалось для ввода/вывода на экран, за исключением того, вместо cin и cout используется связанный с файлом поток. При чтении и записи файлов с использованием << и >> также используются и функции языка С: fprintf() и fscanf(). Вся информация в файле хранится в том же формате, как если бы она выводилась на экран. Следовательно, файл, создаваемый с помощью операции <<, представляет собой файл с отформатированным текстом, и наоборот, любой файл, который считывается с помощью операции >>. должен быть файлом с отформатированным текстом.

Примеры:

1. Эта программа, которая создает выходной файл, записывает в него информацию, закрывает файл, потом снова его открывает уже в качестве входного файла и считывает информацию:

#include <iostream.h>

#include <fstream.h>

main()

{ ofstream fout("test"); // создание обычного файла вывода

if(!fout)

{ cout << "Файл открыть невозможно\n";

return 1;

}

fout << "Привет!\п";

fout << 100 << ' ' << hex << 100 << endl;

fout.close();

ifstream fin ("test"); // открытие обычного файла ввода

if(!fin)

{ cout << Файл открыть невозможно\n";

return 1;

}

char str[80];

int i;

fin >> str >> i;

cout<< str << ' ' << i << endl;

fin.close ();

return 0;

}

После завершения программы содержимое файла test будет следующим:

Привет!

100 64

Как уже установлено, при использовании операторов << и >> для реализации файлового ввода/вывода, информация форматируется так же, как это делалось бы при выводе на экран.

2. Следующим является другой пример дискового ввода/вывода. Эта программа считывает введенные с клавиатуры строки и записывает их в файл. Программа завершается при вводе пустой строки.

#include <iostream.h>

#include <fstream.h>

#include <stdio.h>

main()

{ ofstream fout("test"); // создание обычного файла вывода

if(!fout)

{ cout << "Файл открыть невозможно\n";

return 1;

}

char str [80];

cout << "Введите строки в файл; для окончания нажмите ENTER\n";

do

{ cout << ": ";

gets(str);

out << str << endl;

} while (*str);

out.close ();

return 0;

}





Дата публикования: 2015-02-22; Прочитано: 429 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.01 с)...