Хрестоматия по программированию на Си в Unix


Работа с файлами. Хрестоматия по программированию на Си в Unix - стр. 3


  • буфер заполнен (содержит BUFSIZ символов).
  • при закрытии файла (fclose или exit).
  • при вызове функции fflush (см. ниже).
  • в специальном режиме - после помещения в буфер символа '\n' (см. ниже).
  • в некоторых версиях - перед любой операцией чтения из канала stdin (например, при вызове gets), при условии, что stdout буферизован построчно (режим _IOLBF, смотри ниже), что по-умолчанию так и есть.
  • Приведем упрощенную схему, поясняющую взаимоотношения основных функций и макросов из stdio (кто кого вызывает). Далее s означает строку, c - символ, fp - указатель на структуру FILE. Функции, работающие со строками, в цикле вызывают посимвольные операции. Обратите внимание, что в конце концов все функции обращаются к системным

    вызовам read и write, осуществляющим ввод/вывод низкого уровня.

    Системные вызовы далее обозначены жирно, макросы - курсивом.

    Открыть файл, создать буфер:

    #include <stdio.h>

    FILE *fp = fopen(char *name, char *rwmode); | вызывает V int fd = open (char *name, int irwmode); Если открываем на запись и файл не существует (fd < 0), то создать файл вызовом: fd = creat(char *name, int accessmode); fd будет открыт для записи в файл.

    По умолчанию fopen() использует для creat коды доступа accessmode равные 0666 (rwrw-rw-).

    Соответствие аргументов fopen и open:

    rwmode irwmode ------------------------ "r" O_RDONLY

    "w" O_WRONLY|O_CREAT |O_TRUNC

    "r+" O_RDWR

    "w+" O_RDWR |O_CREAT |O_TRUNC

    "a" O_WRONLY|O_CREAT |O_APPEND

    "a+" O_RDWR |O_CREAT |O_APPEND

    Для r, r+ файл уже должен существовать, в остальных случаях файл создается, если его не было.

    Если fopen() не смог открыть (или создать) файл, он возвращает значение NULL:

    if((fp = fopen(name, rwmode)) == NULL){ ...неудача... }

    Итак, схема:

    printf(fmt,...)--->--,----fprintf(fp,fmt,...)->--* fp=stdout | fputs(s,fp)--------->--| puts(s)----------->-------putchar(c)-----,---->--| fp=stdout | fwrite(array,size,count,fp)->--| | Ядро ОС putc(c,fp) ------------------* | |файловая---<--write(fd,s,len)------------<----БУФЕР |система---->---read(fd,s,len)-* _flsbuf(c,fp) | | ! | |системные буфера ! | | | ! V ungetc(c,fp) |драйвер устр-ва ! | | |(диск, терминал) ! | _filbuf(fp) | | | ! *--------->-----БУФЕР<-* |устройство ! | ------------------* c=getc(fp) | rdcount=fread(array,size,count,fp)--<--| gets(s)-------<---------c=getchar()------,----<--| fp=stdout | | fgets(sbuf,buflen,fp)-<--| scanf(fmt,.../*ук-ли*/)--<-,--fscanf(fp,fmt,...)-* fp=stdin




    - Начало -  - Назад -  - Вперед -



    Книжный магазин