Скачать 5.48 Mb.
|
Тема: Работа с файлами С++ Цель: получить практические навыки программирования задач ввода-вывода с использованием файлов. Теоретические сведения Организация ввода и вывода. Файловая система Операции ввода/вывода в языке Си осуществляются через потоки. Поток - это логическое устройство, выдающее и принимающее информацию. С потоком связано понятие внутреннего указателя, который определяет позицию, с которой начинается следующая операция чтения или записи. При каждой операции чтения или записи происходит автоматическое перемещение указателя. В языке Си (С++) формат стандартных файлов ввода/вывода описан в заголовочном файле stdio.h. Имена стандартных файлов ввода/вывода для языка Си (С++) представлены в табл. 7.1. В момент начала выполнения программы на языке Си (С++) автоматически открываются три потока: stdin, stdout, stderr. Таблица .1 Потоки, определяемые в языке Си и С++
С++ поддерживает всю систему ввода/вывода Си и добавляет к ней дополнительные возможности, связанные в основном с вводом/выводом объектов. Описание средств для создания потоков в С++ представлено в заголовочном файле iostream.h. Когда начинает работать программа на С++, открываются потоки, приведенные в табл. 7.2. Таблица.2 Потоки, определяемые в языке С++
Файловая система языков Си и С++ состоит как бы из двух уровней: логических файлов ; физических файлов, с которыми логические файлы всегда связаны. Логический файл описывается как указатель на открываемый поток FILE * и служит средством взаимодействия с физическим файлом. Имя физического файла появляется в программе всего один раз, в тот момент, когда происходит открытие файла, осуществляемое функцией fopen() и одновременно его связывание с логическим файлом. Основными действиями, производимыми над файлами, являются : открытие файла , обработка файла закрытие файла. Обработка файлов может заключаться в следующем : считывание блока данных из потока в оперативную память, запись блока данных из оперативной памяти в поток, считывание определенной записи данных из потока, занесение определенной записи данных в поток. При этом необходимо помнить, что понятие файла в памяти ЭВМ не определено, и приобретает смысл только после его связи с внешним физическим файлом. Текстовые файлы Тип FILE определяется в заголовочном файле stdio.h и обычно представляет собой структуру, содержащую параметры реализации потока, такие как адреса буферов, указатели позиций потока, маркеры ошибок потока и т.д. При работе с дисковыми файлами в момент их открытия следует задать режим доступа, чтобы определить, к какому файлу осуществляется доступ: к текстовому или двоичному, а также способ доступа: чтение или запись. Все это выполняется функцией fopen(), имеющей синтаксис: fopen("имя_файла", "режим_доступа") Режимы доступа к файлам для функции fopen() приведены в табл. 7.3. Таблица.3 Режимы доступа к файлам
Пример : Открыть текстовый файл для чтения FILE *ft; // объявили указатель на файловый поток ft = fopen("inp_f.txt","r"); // открыли файл inp_f.txt При попытке открыть существующий файл можно допустить ошибку в его имени или в указании пути к нужному файлу. Это вызывает ошибку исполнения программы. Следует предвидеть подобные ситуации и проводить проверку возможности открытия файла. Такую проверку осуществить довольно легко, так как функция fopen() возвращает значение указателя в случае успешного его открытия и значение NULL, если доступ к файлу невозможен. Поэтому для проверки достаточно написать: if (ft = fopen("inp_f.txt","r") != NULL) { // обработка файла } Текстовой файл состоит из последовательности символов, разбитой на строки путем использования управляющего символа \n. На диске текстовые файлы хранятся в виде сплошной последовательности символов, и их деление на строки становится заметным лишь в момент вывода на экран или печать, так как именно при выводе управляющие символы начинают выполнять свои функции. Текстовые файлы легко переносятся с одного типа компьютера на другой лишь в случаях, когда они содержат только символы, принадлежащие стандартному набору символов. При работе с текстовыми файлами возможна их посимвольная или построчная обработка. Основные методы обработки текстовых файлов Файловые функции ввода/вывода fprintf() и fscanf() работают аналогично функциям printf() и scanf(), но имеют дополнительный аргумент, являющийся указателем на файловый поток. Задание .1. Чтение одного элемента из файла, обработка и запись результата в текстовый файл. #include #include #include void main() { FILE *f; int dig; if (f = (fopen("inp_f","r")) == NULL) // открыть файл для чтения { printf("Невозможно открыть файл!\n"); exit(0); } fscanf(f, "%d", &dig); // считать значение dig из файла fclose(f); // закрыть файл f = fopen("out_f","w"); // открыть файл для записи fprintf(f, "Мы прочитали число %d", dig); fclose(f); // закрыть файл } Мы использовали один и тот же указатель на файловый поток дважды, так как прежде, чем обращаться к нему вторично, закрыли связанный с ним файл и освободили, таким образом, указатель. В приведенном примере имя файла было записано непосредственно в операторе открытия файла. Но можно сообщить имя открываемого файла, введя его с клавиатуры или пользуясь аргументами командной строки. Задание 2. Написать программу, которая сжимает содержимое файла, записывая в выходной файл лишь каждый третий символ из входного файла. #include #include #include #include void main(int argc, char *argv[]) { FILE *f_in, *f_out; int ch; char *name; // имя входного файла int count = 0; // счетчик элементов if (argc<2) // в командной строке нет имени { printf("Введите имя входного файла"); gets(name); } else name = argv[1]; // взять имя из командной строки if ((f_in = fopen(name, "r")) != NULL) { strcat(name, ".out"); // добавляет расширение .out // к имени файла f_out = fopen(name, "w"); // открывает файл для записи while((ch = fgetc(f_in)) != EOF) if (count++ % 3 == 0) fputc(ch, f_out); // выводит каждый третий символ fclose(f_in); fclose(f_out); } else printf("Невозможно открыть файл\n "); } При работе с текстовыми файлами возможна не только поэлементная обработка файлов, но и построчная. Задание 3. Построчное чтение информации из входного файла и вывод ее на экран как на стандартное устройство вывода. #include #include #include #include void main(int argc, char *argv[]) { FILE *f_in; char buffer[256]; // максимальная длина строки - 255 символов char *name; // имя входного файла if (argc<2) // в командной строке нет имени { printf("Введите имя входного файла"); gets(name); } else name = argv[1]; // взять имя из командной строки if ((f_in = fopen(name, "r")) != NULL) { while (fgets(buffer,255,f_in)) != NULL) { fputs(buffer, stdout); fputc('\n', stdout); } fclose(f_in); } else printf("Невозможно открыть файл\n "); } Задания для самостоятельной работы: 1. Случайным образом создать таблицу пар целочисленных значений и записать её в текстовый файл в виде: X Y 5 1 2 8 12 3 и т.д. Считать из файла пары значений и в тех из них, где X>Y , поменять значения X и Y местами. Результат записать в другой текстовый файл такого же формата. 2. Ввести с клавиатуры попарно значения вещественного типа и записать их в текстовый файл в виде таблицы следующего формата: X : Y 2.1 : 3.7 6.2 : 5.4 и т.д. Считать из файла полученные пары значений и создать из них другой файл вида: sin(x) : cos(y) значение sin(2.1) : значение cos(3.7) и т.д. 3. Ввести с клавиатуры попарно значения вещественного типа и записать их в текстовый файл в виде таблицы следующего формата: X : Y 2.1 : 3.7 6.2 : 5.4 и т.д. Считать из файла полученные пары значений и создать из них другой файл вида: tg(x) : ctg(y) значение tg(2.1) : значение ctg(3.7) и т.д. 4. Случайным образом создать таблицу пар значений и записать её в текстовый файл в виде: n * c 5 * m 7 * a 3 * q и т.д. Считать из файла пары значений и создать из них другой текстовый файл вида mmmmm aaaaaaa qqq 5. Случайным образом создать таблицу пар значений и записать её в текстовый файл в виде: n * c 5 * 3.1 7 * 4.2 3 * 8.3 и т.д. Считать из файла пары значений и создать из них другой текстовый файл вида произведений: 15.5 29.4 24.9 6. Случайным образом создать таблицу пар целочисленных значений и записать её в текстовый файл в виде: X Y 5 1 2 8 12 3 и т.д. Считать из файла пары значений и в тех из них, где X кратен Y , пометить строку таблицы: X Y 5 1 *** 2 8 12 3 *** в том же файле. 7. Случайным образом создать таблицу пар целочисленных значений и записать её в текстовый файл в виде: X Y 5 8 2 1 1 3 и т.д. Считать из файла пары значений и в тех из них, где X меньше Y , пометить строку таблицы: X Y 5 8 ### 2 1 1 3 ### в том же файле. 8. Случайным образом создать таблицу пар значений и записать её в текстовый файл в виде: a b c 5.2 4.6 2.5 1.2 8.9 2.3 и т.д. Считать из файла записанные данные и определить, можно ли построить треугольник с такими сторонами. Пометить соответствующие строки таблицы (в том же файле). a b c 5.2 4.6 2.5 можно 1.2 8.9 2.3 9. Создать текстовый файл, содержащий вещественные значения. Считать из файла записанные данные и определить максимальное значение. Если оно находится в первой половине файла, заменить его суммой последующих элементов, если во второй – суммой предыдущих элементов. 10. Случайным образом создать таблицу пар целочисленных значений и записать её в текстовый файл в виде: X Y 5 25 1 3 49 7 и т.д. Считать из файла пары значений и в тех из них, где X является точным квадратом Y или наоборот, найти сумму значений X и Y. Результат записать в другой текстовый файл в виде X Y sum 5 25 30 1 3 49 7 56 11. Создать текстовый файл, содержащий целые числовые значения, например : 5 3 21 4 37 52 9 2. Считать из файла записанные данные и определить минимальное значение. Если оно кратно трем, заменить каждое третье значение файла нулем, если кратно пяти – заменить его суммой первого и последнего элементов. 12. Создать текстовый файл, содержащий целые числовые значения, например: 15 13 21 42 37 50 9 2. Считать из файла записанные данные и заменить нулем каждое значение файла, кратное минимальному числу. 13. Ввести с клавиатуры значения вещественного типа и записать их в текстовый файл в виде таблицы следующего формата: X : Y : Z 2.1 : 3.7 : 0.9 6.2 : 5.4 : 4.2 и т.д. Считать из файла полученные значения и создать из них другой файл вида: sin(max{X,Y,Z}) : cos(min{X,Y,Z}) значение sin(3.7) : значение cos(0.9) Литература Дж. Рихтер. Windowsдля профессионалов. – 3-е изд.: М: Русская редакция. 1993; 4-е изд: СПб: Русская редакция, 2001. – 752 с. [шифр библиотеки 681.3 Р-558] Д. Круглински, С. Уинглоу, Дж. Шеферд. Программирование на MicrosoftVisualC++ 6.0 для профессионалов. – СПб: Питер, М: Русская редакция, 2001. – 864 с. [шифр библиотеки 681.3 К-844] Архангельский А.Я. Программирование в C++Builder5. – М: БИНОМ, 2000. – 1152 с. Вильямс А. Системное программирование в Windows2000 для профессионалов. – СПб.: Питер, 2001 – 624 с. [шифр библиотеки 681.3 В-467]
Практическая работа №7 |
В соответствии с Федеральным законом от 24. 07. 2007 №221-фз «О государственном кадастре недвижимости» (далее Закон) в отношении... | |||
Количество образовательных программ бакалавриата, специалитета и магистратуры (без учета программ, реализация которых завершается... | ... | ||
Составление плана подготовки и проведения путешествия. Разработка маршрута, подбор картографического материала, составление схемы... | «Выдача разрешений на ввод линейных объектов, расположенных на территории двух и более поселений Добрянского муниципального района,... | ||
Портфолио учащегося: составление и использование: методические рекомендации./ Автор-составитель: Т. Б. Табарданова – Ульяновск: уипк... | Рабочая программа профессионального модуля «Составление и использование бухгалтерской отчётности» является частью основной профессиональной... | ||
Программа практики является составной частью профессионального модуля 04 Составление и использование бухгалтерской отчетности основной... | Предварительная проработка литературы по теме и составление «рабочего» плана курсовой работы 7 |
Поиск Главная страница   Заполнение бланков   Бланки   Договоры   Документы    |