Setlocale( LC_ALL, ".1251" );//кодовая страница Windows – 1251
Программный код решения примера
В программе введены две проверки: на открытие файла if (¼!= 0) и на его закрытие if (¼!= 0), позволяющие исключить аварийный выход из программы. Использование в функции форматного вывода fprintf() ключевого слова stdout позволяет выводить сообщения на консоль – дисплей пользователя. Вместо стандартной функции gets(), приработе с которой появляются предупреждения, использована функция gets_s(), которую поддерживает MS Visual Studio. Предупреждения возникают и при обращении к функции fopen(). Вместо нее применена fopen_s() в следующем формате записи: fopen_s(&fid, "D:\\data5.txt","a+"); Если файл data5.txt сохранить, то при последующих выполнениях программы в него можно будет дописывать данные. Это обеспечивает режим "a+" функции fopen_s(). Рис. 12.7. Пример записи в файл и чтения из файла Задание 5 1. В программу при записи в файл и чтения из файла введите свою фамилию, специальность, на которой Вы учитесь, и номер группы. 2. В программу вместо функции fgets() включите функцию fscanf(). Отметьте результат записи и чтения некоторого количества строк, состоящих из нескольких слов. 3. Отметье результат выполнения программы, если изменить имя текстового файла на диске D. Пример 6. Написать программу записи в файл нескольких строк и отображения содержимого файла в обратном порядке как на консоли, так и в другом текстовом файле. Для решения примера используем функции fseek() и ftell().
Программный код решения примера
Опишем работу функций fseek() и ftell() [9]. Функция fseek() имеет следующую форматную запись: fseek(fid, 0L, SEEK_END); Она определяет позицию со смещением в 0 байт от конца файла (именованная константа SEEK_END). Суффикс L означает тип long int. Строка с функцией ftell() определяет количество байтов от начала до конца указанного файла которое записывается в переменную m: m = ftell(fid); Рассмотрим следующий программный цикл.
Первая итерация цикла выводит программу на первый символ перед концом файла. Затем программа печатает этот символ на консоль и записывает в новый файл с именем data66.txt. Следующая итерация цикла выводит программу на предпоследний символ файла, который она печатает и записывает в новый файл. Этот процесс продолжается до тех пор, пока программа не выйдет на первый символ файла и не распечатает его (и запишет в файл). Возможные результаты выполнения программы приведены на рис. 12.8–12.10.
Рис. 12.10. Результат записи информации в файл в обратном порядке Задание 6 1. Вывод информации в дополнительный текстовый файл сделайте построчно, каждую строку запишите в обратном порядке (для рассмотренного примера в три строки). 2. Вместо функции putchar() примените printf(). 3. Вместо функции putc() примените функцию с тем же действием. 4. Подготовьте текстовый файл со своими фамилией, инициалами, номером группы, специальности. Выполните чтение из этого файла в обратном порядке, выведите на консоль и запишите в дополнительный текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа. Пример 7. Создать файл последовательного доступа и записать в него информацию, состоящую из целых чисел, строки символов и вещественных чисел. После произведенной записи вывести содержимое файла на консоль и перезаписать в другой файл. Предположим, что имеются номера ячеек, их имена (например, по фамилии владельца) и определенное количество денег в условных единицах (у. е.). Для форматированного считывания данных из файла применим библиотечную функцию fscanf_s(). Программный код решения примера
В программе использована функция feof(), которая проверяет, достигнут ли конец файла, связанного с потоком (указателем на файл) fid. Рис. 12.11. Консольный вывод содержимого файла Следует обратить внимание на прекращение ввода данных с клавиатуры с помощью комбинации клавиш Ctrl+Z. Задание 7 1. Вместо оператора цикла if примените оператор цикла for. 2. Отсортируйте записи владельцев ячеек по убыванию величины суммарной денежной суммы. 3. Подготовьте форматированный текстовый файл с именем compX, где Х – номер компьютера, на котором выполняется лабораторная работа. Затем информацию из файла выведите на консоль. Пример 8. Написать программу пакетной записи в файл произвольного доступа массива данных и вывода этого пакета на консоль. При решении примера применим функции fwrite() и fread() для бинарной записи и считывания информации. Программный код решения примера
Функция fwrite() записывает в файл заданное количество байт из буфера памяти, адрес которого передан ей в качестве параметра. Данные записываются с того места в файле, которое обозначено указателем позиции файла. Функция fread() считывает заданное количество байт, начиная с текущей позиции файла в буфер памяти, адрес которого передан ей в качестве параметра. В программе пакетная запись информации – набора строк и матрицы целых чисел производится через двоичный поток с помощью функций fwrite(). Чтение информации из двоичного файла осуществляется функцией fread(). Форматы записи обеих функций одинаковы, так как в них требуется установить количество объектов с заданным размером байт, которые определяются функцией sizeof(). Результат выполнения программы представлен на рис. 12.12 и 12.13.
Рис. 12.13. Результат записи в текстовый файл бинарной информации Как видно из рис. 12.12 и 112.13, информация на консоли соответствует исходной информации, а в двоичном файле она не подлежит непосредственному восприятию. Примечание. Вид бинарной информации в текстовом файле зависит от установленных шрифтов. Задание 8 1. Запишите двоичную информацию в файлы с расширением .dat, .doc, .bin. Проанализируйте файлы после их открытия. 2. Вместо массива указателей примените двухмерный символьный массив необходимой размерности. 3. Вместо массива указателей примените схему с двухуровневой адресацией. 4. Вместо двухмерного массива целых чисел примените целочисленный указатель. 5. Перезапишите информацию из двоичного файла в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа.
Контрольные вопросы 1. Что может быть файлом в языке С? 2. Какие обязательные операции выполняются при нормальной работе с файлами? Какие библиотечные функции при этом используются? 3. Как определяется текстовой поток в стандарте языка С? 4. Как определяется двоичный поток в стандарте языка С? 5. Что представляет собой указатель файла? 6. С помощью каких функций языка С осуществляются форматная запись в файл и форматное чтение данных из файла? 7. Какая переменная стандартной библиотеки используется для определения стандартного потока вывода на дисплей? 8. Какая переменная стандартной библиотеки используется для определения стандартного потока чтения с дисплея? 9. Как в языке С кодируется признак конца файла? 10. Как в языке С кодируется признак конца строки? 11. Что такое файл произвольного доступа? 12. Как в языке С осуществляется пакетная запись данных в файл? 13. Как осуществляется запись бинарной информации в текстовый файл? 14. Как осуществляется чтение бинарной информации из текстового файла?
|