Перед началом работы с файлом его надо создать (открыть), а по окончании работы закрыть. Эти два действия выполняет программа:
Пример:
#include <stdio.h> main( )
{ FILE *f ;
f = fopen("test.dat", "w"); /*w-маленькая буква*/
fclose(f) ;
}
Перед началом работы с файлом надо создать указатель на структуру данных типа FILE, описанную в файле STDIO.H.
В нашей программе этот указатель-адрес обозначен именем f. Затем необходимо вызвать функцию fopen(), которая может создать новый файл для записи в него, либо открыть существующий на диске файл для записи или (и) чтения. После вызова этой функции создается структура типа FILE и указатель f содержит адрес начала этой структуры в памяти. Его можно распечатать как обыкновенное целое вызовом функции print("%u\n",f), которую надо вставить сразу после открытия. В оперативной памяти отводится массив размером 512 байт, который используется при обмене, данными между файлом на диске и программой. Этот массив называется буфером.
При закрытии файла память, отведенная под структуру и буфер, должна освободиться, а указатель обнулиться, что означает ни на что не указывав.
При указании режима доступа в функции fopen должны использоваться только маленькие буквы.
Задача: вывод данных в файлы символов. Для этого в Си-библиотеке имеется специальная функция fputc(c.f), где 'с' хранит код символа выводимого в файловый поток Т. Программа:
#include<stdio.h>
main()
{
FILE *f;
f = fopen ( " tes t. da. t", "w") ;
fputc("A",£) ;
fclose(f) ;
}
Эта программа содержит вызов функции fputc(). Запустив эту программу, и просмотрев текущий каталог обнаружим в нем файл TEST.DAT содержащий символ 'А'. Усовершенствуем нашу программу:
Пример 2:
#include<stdio.h>
main()
{
int n;
FILE *f;
char c='A' f = fopen ("test.da.t", "w") ;
for (n=0; n<100; n++) ;
fpv.tc(c,f) ;
fclose(f) ;
}
Для того чтобы программа печатала сто строк с одним символом А в строке в тело цикла for нужно вставить составной оператор: {fputs(c,f); fputs('\n',f);}
Побайтное чтение из файла и функции fgetc()
Научимся читать текстовые файлы. Для чтения файлов имеется специальная функция fgetc(f), которая возвращает текущий символ из файлового потока f. Рассмотрим программу:
Пример:
#include <stdio.h>
main()
{
int с;
FILE *f;
f^fopen ("'test. dat", "r"') ;
while ( ( c=f<Jetc(f)) i. =EOF)
printf("c" ,c) ;
fclose(f) ;
}
При открытии файла мы указали режим "r" - режим чтения из файла, в цикле while прочитанные символы печатаются путем вызова функции printf().
Значение оператора присваивания fgetc(f) равно символу с прочитанному из файлового потока f, т.е. при проверке while - условия каждый раз читается символ из файлового потока и сравнивается затем с признаком конца файла.
Определение конца файла. Идея заключается в том, чтобы функции fgetc(f) выдавала некоторый специальный код, который бы и означал достижение конца файла. Если функция fgetc(f) возвращает байт, то это означает утрату одного из символов, который должен быть зарезервирован как признак конца файла.
Функция fgetc(f) возвращает не байт, а целое двухбайтовое число. Пока в файле есть еще не прочитанные байты, функция возвращав двухбайтовое число, старший байт которого равен нулю, а в младшем байте находится значение прочитанного из файлового потока байта. Как только мы подошли к самому концу файла, когда уже нечего читать, обращение к функции приводит к тому, что во все биты возвращенного слов записаны единицы. В этом случае и используется старший байт.
Это не единственный случай генерации признака конца файла. В операционной системе MS-DOS принято соглашение, что признаком конца текстового файла являете символ CTRL-Z с кодом 26. Если из файла был прочитан байт, в котором хранится число 26, то функция выдает -1, что означает конец файла.
Поэтому приведенный выше метод чтения файлов годится и для чтения нетекстовых файлов. Но в этих файлах должны отсутствовать байты со значением 26, иначе чтение файл. прервется на первом встреченном байте с "CTRL+Z",
Для побайтного чтения нетекстовых файлов можно также использовать функцию fgetc(f). Но в этом случае открытие файла должно быть произведено в бинарном режиме.
Например:
fopen ("tc.exe", rb) ;
Форматная запись в файл и функция fprintf()
Существуют два способа записи чисел в файл.
Первый из них- запись чисел "живьем", то есть так, как они представляются в оперативной памяти. Чтобы так записывать числа, используя функцию fputc(f), надо эти числа разделить на байты, их составляющие, и, затем записать побайтно в файл.
Рассмотрим второй способ. Он, заключается в преобразовании числа ,представляющую его символьную строку с последующей записью её в файл, как строки символов.
Для такой форматной записи в файлы в библиотеке Си имеется специальная функция fprintf() Первый аргумент указывает файловый поток, в который будут выводиться данные. За ним идут параметры, что и в обычной функции printf(), форматная строка и выводимые переменные. Функция fprintf() преобразует указанные переменные в символьные строки и выводит их, символ за символом, в файловый поток.
Пример:
#include<stciio.h>
main()
{
int i,r;
FILE *f;
f = fopen ( "rand. da. t", "w") ;
for (i=0; i<100; i++)
{
r = = rand () ;
fprintf(f, "%d\n",r) ;
fсlose() ;
}
После трансляции и запуска программы в текущем каталоге должен появиться одноименный файл, хранящий сто случайных чисел.