Работа с файлами Сазонов Д.О. ПМиЭММ Часть 2
Тема занятия: Работа с файлами через потоки Для реализации файлового ввода/вывода, необходимо включить в программу заголовок. В нем определено несколько классов, включая классы ifstream, ofstream и fstream. Эти классы являются производными от классов istream и ostream. Классы istream и ostream, в свою очередь, являются производными от класса ios, поэтому классы ifstream,. ofstream и fstream также имеют доступ ко всем операциям, определяемым классом ios
Имеется три типа потоков:ввода,выводаи ввода/вывода Перед тем как открыть файл, нужно, во-первых, создать поток. Для создания потока ввода необходимо объявить объект типа ifstream. Для создания потока вывода объект типа ofstream. Потоки, которые реализуют одновременно ввод и вывод, должны объявляться как объекты типа fstream Например, в следующем фрагменте создается один поток для ввода, один поток для вывода и еще один поток одновременно для ввода и для вывода: ifstream in; // ввод ofstream out; // вывод fstream io; // ввод и вывод
После создания потока, одним из способов связать его с файлом является функция ореn(). Эта функция является членом каждого из трех потоковых классов. void if stream::open (const char *имя_файла, openmode режим = ios::in); void ofstream::open(const char *имя_фляла, openmode режим = ios::out | ios::trunc); void fstream::open(const char *имя файла, openmode режим = ios::in | ios::out); Здесь имя_файла имя файла, в которое может входить и спецификатор пути. Значение режим задает режим открытия файла. Оно должно быть значением типа openmode, которое является перечислением, определенным в классе ios.
Значение режим может быть одним из следующих: ios::арр ios::ate ios::binary ios::in ios: :out ios::trunc Вы можете объединить два или более этих значения с помощью оператора OR. Рассмотрим, что означает каждое из этих значений.
Значение ios::app вызывает открытие файла в режиме добавления в конец файла. Это значение может применяться только к файлам, открываемым для вывода. Значение ios::ate задает режим поиска конца файла при его открытии. Хотя значение ios::ate вызывает поиск конца файла, тем не менее, операции ввода/вывода могут быть выполнены в любом месте файла. Значение ios::in задает режим открытия файла для ввода. Значение ios::out задает режим открытия файла для вывода. Значение ios::binary вызывает открытие файла в двоичном режиме. По умолчанию все файлы открываются в текстовом режиме. В текстовом режиме имеет место преобразование некоторых символов, например последовательность символов "возврат каретки/перевод строки" превращается в символ новой строки.
Если же файл открывается в двоичном режиме, такого преобразования не выполняется. Любой файл, независимо от того, что в нем содержится отформатированный текст или необработанные данные может быть открыт как в текстовом, так и в двоичном режиме. Отличие между ними только в отсутствии или наличии упомянутого символьного преобразования. Значение ios::trunc приводит к удалению содержимого ранее существовавшего файла с тем же названием и усечению его до нулевой длины. При создании потока вывода с помощью ключевого слова ofstream любой ранее существовавший файл с тем же именем автоматически усекается до нулевой длинны. В следующем фрагменте для вывода открывается файл test: ofstream mystream; mystream.open("test");
Режим функции ореn() по умолчанию устанавливаем в значение, соответствующее типу открываемого потока, поэтому нет необходимости указывать его явно. Если выполнение функции ореn() завершилось с ошибкой, в булевом выражении поток будет равен значению false. Этот факт можно использовать для проверки правильности открытия файла с помощью, например, такой инструкции: if (!mystream){ cout
Проверить правильность открытия файла можно также с помощью функции is_ореn(), являющейся членом классов ifstream, ofstream и fstream. Ниже показан прототип этой функции: bool is_open(); Функция возвращает истину, если поток удалось связать с открытым файлом, в противном случае функция возвращает ложь. Например, в следующем фрагменте проверяется, открыт ли файл, связанный с потоком if(!mystream.is_open()) { cout
Хотя использовать функцию ореn() для открытия файла в целом правильно часто вы этого делать не будете, поскольку у классов ifstream, ofstream stream есть конструкторы, которые открывают файл автоматически. Конструкторы имеют те же параметры, в том числе и задаваемые по умолчанию что и функция ореn(). Поэтому будем пользоваться таким способом открытия файла: ifstream mystream("myflie"); // открытие файла для ввода Как уже установлено, если по каким-то причинам файл не открывается, переменная, соответствующая потоку, в условной инструкции будет равна: значению false. Поэтому, независимо от того, используете ли вы конструктор или явно вызываете функцию ореn(), вам потребуется убедиться в успешном открытии файла путем проверки значения потока. Для закрытия файла используйте функцию-член close(). Например, чтобы закрыть файл, связанный с потоком mystream, необходима следующая инструкция: mystream.close();
Функция close() не имеет параметров и возвращаемого значения. С помощью функции eof(), являющейся членом класса ios, можно определить, был ли достигнут конец файла ввода. Ниже показан прототип этой функции: bool eof(); Функция возвращает истину, если был достигнут конец файла в противном случае функция возвращает ложь. После того как файл открыт, очень легко считать из него или записать в него текстовые данные. Просто используйте операторы > так же, как это делалось для консольного ввода/вывода, только замените поток cin или cout тем потоком, который связан с файлом. Так же, как и операторы и для чтения из файла и записи в файл годятся функции С fprintf() и fscanf(). Вся информация в файле хранится в том же формате, как если бы она находилась на экране. Следовательно, файл, созданный с помощью оператора , должен быть файлом с отформатированным текстом.
Рассмотрим примеры: int main() { ofstream fout("test"); // создание файла для вывода if(!fout) { cout
int main(int argc, char *argv[]) { if(argc!=2) { cout \n"; return 1; } ofstream out(argv[1]); // файл для вывода if(!out) { cout
int main(int argc, char *argv[]) { if(argc!=3) { cout \n"; return 1; } ifstream fin(argv[1]); // открытие файла для ввода ofstream fout(argv[2]); // создание файла для вывода if(!out) { cout ch; if(ch==' ') ch = '|'; if(!fin.eof()) fout
Задания на практику 1. Напишите программу для копирования текстового файла. 2. Напишите для подсчета числа слов в файле. Успехов!