Пример 17.1. Запись текстовой информации в файл.-Работает Финансовый университет при правительстве РФ ИНФОРМАТИКА И ПРОГРАММИРОВАНИЕ Бакалавры: 230700 "Прикладная информатика" Язык программирования С++ Лабораторная работа № 17(01-3) ФАЙЛОВЫЙ ВВОД-ВЫВОД. ТЕКСТОВЫЕ И ДВОИЧНЫЕ ФАЙЛЫ Автор профессор кафедры "Прикладной информатики в экономике" кандидат технических наук Л.К. Кузнецов Сентября 2012 г. Москва ФУРФ Лабораторная работа № 17 Файловый ввод-вывод. Текстовые и двоичные файлы Цель работы: Ознакомиться: Ø с организацией ввода и вывода в языке С++; Ø с понятием потока; Ø с режимами доступа к файлам; Ø с основными методами обработки текстовых файлов; Ø с основными методами обработки двоичных файлов Ø с организацией последовательного доступа к элементам двоичных файлов; Ø с организацией произвольного доступа к элементам двоичных файлов. Изучить возможности операций файлового ввода/вывода на языке C++. Научиться программировать операции файлового ввода/вывода. Получить практические навыки по программированию задач ввода-вывода с использованием текстовых и двоичных файлов. 1. КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ Ниже приводятся минимальные сведения, необходимые только для выполнения лабораторной работы. 1. Файловый ввод-вывод. Текстовые файлы 1.1. Организация ввода и вывода. Файловая система Операции ввода/вывода в языке С осуществляются через потоки. Поток - это логическое устройство, выдающее и принимающее информацию. С потоком связано понятие внутреннего указателя, который определяет позицию, с которой начинается следующая операция чтения или записи. При каждой операции чтения или записи происходит автоматическое перемещение указателя. В языке С (С++) формат стандартных файлов ввода/вывода описан в заголовочном файле stdio.h. Имена стандартных файлов ввода/вывода для языка С (С++) представлены в табл. 17.1. В момент начала выполнения программы на языке С (С++) автоматически открываются три потока: stdin, stdout, stderr. Таблица 17.1 Потоки, определяемые в языке С и С++ Имя стандартного файла | Описание | stdaux | Последовательный ввод/вывод | stderr | Выходной поток ошибок | stdin | Стандартный ввод | stdout | Стандартный вывод | stdprn | Вывод на принтер | С++ поддерживает всю систему ввода/вывода С и добавляет к ней дополнительные возможности, связанные в основном с вводом/выводом объектов. Описание средств для создания потоков в С++ представлено в заголовочном файле iostream.h. Когда начинает работать программа на С++, открываются потоки, приведенные в табл. 17.2. Таблица 17.2 Потоки, определяемые в языке С++ Имя стандартного файла | Описание | cin | Стандартный ввод - клавиатура | cout | Стандартный вывод - экран | cerr | Стандартная ошибка - экран | clog | Буферизованная версия cerr - экран | Файловая система языков С и С++ состоит как бы из двух уровней: логических файлов и физических файлов, с которыми логические файлы всегда связаны. Логический файл описывается как указатель на открываемый поток FILE * и служит средством взаимодействия с физическим файлом. Имя физического файла появляется в программе всего один раз, в тот момент, когда происходит открытие файла, осуществляемое функцией fopen() и одновременно его связывание с логическим файлом. Основными действиями, производимыми над файлами, являются их открытие, обработка и закрытие. Обработка файлов может заключаться в считывании блока данных из потока в оперативную память, запись блока данных из оперативной памяти в поток, считывание определенной записи данных из потока, занесение определенной записи данных в поток. При этом необходимо помнить, что понятие файла в памяти ЭВМ не определено, и приобретает смысл только после его связи с внешним физическим файлом. 1.2. Текстовые файлы Для работы с файлами в языке С имеется набор функций, определенных в библиотеке stdio.h. Тип FILE определяется в заголовочном файле stdio.h и обычно представляет собой структуру, содержащую параметры реализации потока, такие как адреса буферов, указатели позиций потока, маркеры ошибок потока и т.д. При работе с дисковыми файлами в момент их открытия следует задать режим доступа, чтобы определить, к какому файлу осуществляется доступ: к текстовому или двоичному, а также способ доступа: чтение или запись. Все это выполняется функцией fopen(), имеющей синтаксис: FILE *fopen(const char *filename, const char *mode ); fopen("имя_файла", "режим_доступа") Здесь filename - строка, содержащая путь и имя файла; mode - строка, определяющая режим открытия файла: на чтение или на запись; FILE -специальный тип данных для работы с файлами. Данная функция возвращает значение NULL, если файл не был успешно открыт, иначе - другое значение. Режимы доступа к файлам для функции fopen() приведены в табл. 17.3. Таблица 17.3 Режимы доступа к файлам Режим | Описание | r | Открыть файл только для чтения, модификации файла запрещены. | w | Создать новый файл только для записи. При попытке открыть таким способом существующий файл происходит перезапись файла. Чтение данных из файла запрещено. | a | Открыть файл для дозаписи. Если файла с указанным именем не существует, он будет создан. | r+ | Открыть существующий файл для чтения и записи. | w+ | Создать новый файл для чтения и записи. | а+ | Открыть существующий файл для дозаписи и чтения. | Таким образом, чтобы открыть текстовый файл, например, для чтения, нужно произвести следующие действия: FILE *ft; // объявили указатель на файловый поток ft = fopen("inp_f.txt","r"); // открыли файл inp_f.txt При попытке открыть существующий файл можно допустить ошибку в его имени или в указании пути к нужному файлу. Это вызывает ошибку исполнения программы. Следует предвидеть подобные ситуации и проводить проверку возможности открытия файла. Такую проверку осуществить довольно легко, так как функция fopen() возвращает значение указателя в случае успешного его открытия и значение NULL, если доступ к файлу невозможен. Поэтому достаточно написать: if (ft = fopen("inp_f.txt","r") != NULL) { // обработка файла } Текстовой файл состоит из последовательности символов, разбитой на строки путем использования управляющего символа \n. На диске текстовые файлы хранятся в виде сплошной последовательности символов, и их деление на строки становится заметным лишь в момент вывода на экран или печать, так как именно при выводе управляющие символы начинают выполнять свои функции. Текстовые файлы легко переносятся с одного типа компьютера на другой лишь в случаях, когда они содержат только символы, принадлежащие стандартному набору символов. При работе с текстовыми файлами возможна их посимвольная или построчная обработка. 1.3. Основные методы обработки текстовых файлов Файловые функции ввода/вывода fprintf() и fscanf() работают аналогично функциям printf() и scanf(), но имеют дополнительный аргумент, являющийся указателем на файловый поток. Рассмотрим последовательность действий по созданию простого текстового файла на языке C и записи в него текстовой информации. Пример 17.1. Запись текстовой информации в файл.-Работает #include <stdio.h> #include <iostream.h> #include <conio.h> int main() { char str_file[]="String for file"; // Строка для файла FILE* fp = fopen("prim17-1.txt","w"); if(fp != NULL) { printf("Идет запись информации в файл…\n"); for(int i=0;i < strlen(str_file);i++) putc(str_file[i],fp); } else printf("Невозможно открыть файл на запись.\n"); fclose(fp); cout << "\nНажмите любую клавишу..." ; getch(); return 0; } В данном примере задается специализированный указатель fp типа FILE, который инициализируется функцией fopen(). Функция fopen() в качестве первого аргумента принимает строку, в которой задан путь и имя файла. Вторым параметром определяется способ обработки файла, в данном случае, значение "w", которое означает открытие файла на запись с удалением всей прежней информации из него. Если файл открыт успешно, то указатель fp не будет равен NULL и с ним возможна работа. В этом случае с помощью функции putc() выполняется запись символов в файл, на который указывает указатель fp. Перед завершением программы открытый файл следует закрыть во избежание в нем потери данных. Это достигается функцией fclose(), которая принимает указатель на файл и возвращает значение 0 при успешном закрытии файла, иначе значение EOF. Замечание: строка "String for file" будет записана в файл с именем "prim17-1.txt" в текущий каталог (где храниться исполняемая программа); откройте указанный файл с помощью соответствующего редактора текста и убедитесь в наличии текста в этом файле. Рассмотрим теперь пример программы считывания информации из файла. |