|
|
6.4. Файлы. В файлах размещаются данные, предназначенные для длительного хранения. Каждому файлу присваивается используемое при обращении к нему имя. Файлы широко используются при решении различных задач. Например, можно ввести какую-либо информацию один раз, сохранить её на диске, и для получения необходимых данных достаточно воспользоваться информацией на диске. Если вы программировали на Паскале, то должны знать, что Паскаль различает следующие основные типы файлов: текстовые, типизированные и не типизированные. Причём текстовые файлы поддерживают все основные типы редакторов: Лексикон, редактор Norton, Far и др. Кроме того, файл содержит деление на строки, т.е. содержат признак конца строки. Типизированные файлы содержат элементы только одного типа, следовательно, одного размера. К элементам типизированных файлов возможен более гибкий доступ, чем к элементам текстовых файлов, по номеру элемента файла. Элементы файла нумеруются целыми числами, начиная с нуля. В отличие от текстовых файлов, здесь нет признака конца строк, однако определяется, сколько занимает элемент, и какого типа. В не типизированных файлах не описан тип элемента.Язык Си такого разделения на типы файлов не делает. Работа с файлом, как в Паскале, так и в Си, делится на три этапа:
Рассмотрим подробнее все три этапа. Прежде чем получить возможность чтения или записи информации в файл, он должен быть открыт. В Паскале мы поступили бы следующим образом:
Или так:
В Си открытие файла можно сделать, например, с помощью функции fopen. Она берёт внешнее представление - физическое имя файла и ставит ему в соответствие внутреннее логическое имя, используемое далее в программах. Логическое имя - это указатель на требуемый файл (на область памяти, где содержится информация о файле). Указатель на файл необходимо объявлять: FILE *fopen( ), *1st; Здесь FILE - имя типа, описанное в стандартном определении stdio.h; 1st - указатель на файл (логическое имя); fopen - функция, выдающая указатель на файл. Обращение к функции fopen в программе производится так: 1st=fopen(физическое имя файла, вид использования файла); Замечание! Физическое имя может быть, например "prn" - для устройства печати; "b:zni.f" - для файла zni.f на диске b: и т.п. Вид использования - это, например, "w" - запись; "r" - чтение; "a" - дополнение. Так же как и в Паскале, если файл открывается для записи или дополнения, но ещё не существует, то он создаётся (если такое возможно). Открытие существующего файла для записи приводит к уничтожению его старого содержимого. В Паскале для работы с текстовыми файлами существуют функции: read, write и их модификации readln и writeln. Например: read(f1,S) - читать из файла f1 строку S write(f1,S) - писать в файла f1 строку S Для типизированных файлов запись несколько другая: read(имя файла-переменной,список переменных write(имя файла переменной,список переменных) В Си для работы с файлами используются библиотечные функции fprintf, fscanf, fgets, fputs; их применение показано на примерах ниже. По окончании работы с файлом он должен быть закрыт. В Паскале, для этих целей используют функцию close(имя файла) - для текстовых, и close; - для типизированных. В Си для этих целей используется библиотечная функция fclose, например: fclose(1st);.
Результатом выполнения программы будет файл ZNI.F на дискете А:, содержащий число 150. Следующая программа покажет, как организовывается чтение информации с дискеты:
В данной программе первая функция fscanf обеспечивает чтение из файла значения целого числа i. Затем полученное значение выводится на экран функцией printf. Оператор повтора while позволяет вывести другие числа из этого файла, если они есть. Работа оператора прекратится после того, как функция fscanf выдаст значение EOF - признак конца файла. Т.к. наш файл, кроме числа 150, не содержит других чисел, то на экран будет выведено только сообщение: число i=150 (начальное значение i). Следующая программа продемонстрирует, как можно выполнить дополнение информации в наш файл.
Попробуйте выполнить сначала первую программу, потом третью. Введите число 9. Ещё раз выполните третью программу и введите число 2000. Теперь выполните вторую программу и на экране получите следующую информацию:
С началом работы любой программы автоматически открываются три файла, и для них определяются соответствующие указатели. Первый из них - это файл для стандартного ввода с клавиатуры с указателем stdin, второй - для стандартного вывода на экран дисплея с указателем stdout, третий - для стандартного вывода ошибок на экран с указателем stderr. Эти объекты являются константами, а не переменными, и им нельзя что-либо присвоить. Однако в ЭВМ можно переназначить входные и выходные потоки, т.е. можно сделать так, чтобы вся информация выводилась не на дисплей, а на принтер. Однако, при любом переопределении информация, записанная в файл с указателем stderr, появится на экране.
В результате выполнения, любая введённая строка, будет записана в файл со спецификацией A:FAL.F с помощью функции fputs, первый параметр которой (str) - идентификатор записываемой строки, а второй (f1) - указатель на соответствующий файл. |