Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебное пособие ОАиП.doc
Скачиваний:
11
Добавлен:
25.04.2019
Размер:
2.63 Mб
Скачать

Функции fread() и fwrite()

Для чтения и записи, блоками данных любого типа, в файловой системе языка С имеется две функции: fread() и fwrite(). Прототипы этих функций имеют соответственно следующий вид:

size_t fread(void *buf, size_t size_tip, size_t count, FILE *f);

size_t fwrite(const void *buf, size_t size_tip, size_t count, FILE *f);

где buf — это указатель на область памяти, в которую будут прочитаны данные из файла (fread()), или указатель на данные, которые будут записаны в файл (fwrite()). Значение count определяет, сколько считывается или записывается элементов данных, причем длина каждого элемента в байтах равна size_tip, f — это указатель файла.

Функция fread() возвращает количество прочитанных элементов. Если достигнут конец файла или произошла ошибка, то возвращаемое значение может быть меньше, чем count. А функция fwrite() возвращает количество записанных элементов. Если ошибка не произошла, то возвращаемый результат будет равен значению count.

Наряду с доступом к информации в файле используя указатель типа FILE* может быть использован подход, основанный на использовании дескриптора (номера) файла. Дескриптор файла имеет тип int. Всякий раз, когда осуществляется ввод/вывод, идентификация файла осуществляется по его номеру. Для обеспечения возможности работы с файлами, как и в предыдущем случае, файл должен быть открыт. Для этого имеется две функции: open и creat.

int open(const char *name, int flags, unsigned mode);

Функция open() открывает файл с именем name и устанавливает режим доступа к нему в соответствии со значением аргумента flags. Аргумент flags представляет собой комбинацию основного режима доступа и модификаторов.

O_RDONLY - открыть только для чтения;

O_WRONLY - открыть только для pfgbcb;

O_RDRW - открыть для записи/чтения;

Выбрав одно из значений основного режима, можно объединить его, используя операцию | (ИЛИ) с одним или большим числом модификаторов:

O_NDELAY - не используется, включен для совместимости с UNIX:

O_APPEND - перемещает указатель в конец файла перед очередной записью:

O_CREAT - если файл не существует, то создает его в соответствии с mode;

O_TRUNC - существующий файл урезает до 0, сохраняя его атрибуты:

O_EXCL - при использовании с O_GREAT не будет создаваться выходной файл если файл с таким именем уже существует;

O_BINARY - открывается двоичный файл;

O_TEXT - открывается текстовый файл.

Аргумент mode требуется только при использовании модификатора O_CREAT и принимает одно из следующих трех значений:

S_IWRITE доступ по записи;

S_IREAD доступ по чтению;

S_IWRITE|S_IREAD доступ по записи /чтению.

Функция возвращает либо дескриптор открытого файла, либо –1 в случае ошибки, при этом errno принимает одно из четырех значений:

ENOENT файл не существует;

EMFILE слишком много открытых файлов;

EACCESS доступ запрещен;

EINVACC недействительный код доступа.

Пример открытия файла с использованием функции open():

int fd;

if ((fd=open(filename,O_WRONLY)==-1)

{ printf(”ошибка открытия файла\n”);

exit(1);

}

Функция close() разрывает связь между файловым дескриптором и открытым файлом. При этом файл закрывается, а дескриптор освобождается для его использования с другим файлом. Она аналогична функции fclose() с той разницей, что не приводит к выталкиванию содержимого буфера в файл. Завершение программы при помощи exit() или return в функции main() закрывает все открытые файлы.