Направления программирования. История создания языка Си. Особенности языка, страница 23

Функции ввода/вывода в Си обеспечивают буферизацию работы с файлами. Это означает, что когда происходит чтение или запись, обмен информации осуществляется не между программой и указателем файлом, а между программой  и промежуточным буфером, расположенным в ОП. Если производится запись в файл, то информация из буфера записывается в файл при заполнении буфера или закрытии файла. Если информация считывается из файла, то она на самом деле берется из буфера, а в буфер считывается при открытии файла и в последствии каждый раз при опустошении буфера.

Буферизация ввода/вывода выполняется автоматически. Она ускоряет работу программы, за счет уменьшения обращения к сравнительно медленно работающим внешним устройствам.

Описание файла.

FILE *<файловая переменная>.

Тип дисковых файлов – это тип структуры определенной в studio.h.

Открытие файла.

FILE *fopen(char *<имя файла>,char *<вид обработки>); - функция открывает поток данных, связанный с указателем файлом и возвращает адрес файлового буфера в ОП.

Прототип функции находится в файле stdio.h. Если произошла ошибка при открытии файла, то функция возвращает NULL.

Параметры функции:

-  <имя файла> - первый параметр функции fopen, может быть задан следующими спрсобами:

1)  сортировкой констант, например:

FILE * stream;

stream=fopen(“C:\\USERS\\SAPR71\\<имя файла>.txt”, <вид обработки>)

2)   в программе определенна строка или массив элементов типа char:

FILE * srteam;

char *imf=(char*)malloc(13);

printf(“Введите имя файла”);

gets(imf);

stream-=fopen(imf, <вид обработки>)          

-  <вид обработки> - второй параметр функции fopen – это строковая константа, которая может принимать одно из следующих значений:

“r” – открыть существующий файл для чтения;

“w” – открыть файл для записи, если файл существовал, то его содержание стирается;

“a” – запись в конец файла, файл создается, если он не существовал;

“r+” – существующий файл открывается для чтения и записи;

“w+” – открыть файл для чтения и записи, если файл существовал, его содержимое теряется;

“a+” – открыть файл для чтения и добавления, если файл не существовал, он создается.

Если файл открыт в режиме “a” или “a+” данные всегда записываются в конец файла; хотя указатель можно всегда перенести, используя соответствующие функции – при записи он всегда будет перемещаться на конец файла, т.е. данные, что были в файле не могут быть затерты.

Если файл открыт в режиме “r+” или “w+” необходимо позиционировать указатель файла.

Если необходимо открыть файл в двоичном режиме в строку <вид обработки> необходимо добавить “b”, например, “rb”, “r+b”.

Закрытие файла.

int fclose(FILE *<файловая переменная>) – Возвращает NULL, если закрытие произошло успешно, и конец файла(EOF). если произошла ошибка.

п.13.5.Ввод\вывод данных из файла.

В программе в любом случае должна быть предусмотрена проверка наличия файла перед работой с ним. Для этого достаточно попытаться открыть этот файл для чтения и проверить значение указателя, возвращаемое функцией fopen.

main()

{ FILE *f;

char *imf=(char*)malloc(13);

printf(“Имя файла”);

gets(imf);

f=fopen(imf, “r”);

if(f!=NULL)

{<обработка файла> fclose(f);}

else rpintf(“Файл %s не открывается для чтения ”, imf);

}

Способа ввода вывода в Си.

Существуют три способа ввода\вывода данных в\из файла:

-  прямой(неформатированный);

-  символьный;

-  форматированный.

Наиболее распространенным способом ввода\вывода при работе с файлами на Си является неформатированный ввод\вывод. При использовании этого способа чтение или запись файл производится байтовыми блоками определенного размера.

1.  Неформатированный ввод\вывод.

Неформатированная запись данных в поток:

int fwrite(void *buf, int size, int count, FILE *stream);