Имеется две эквивалентные функции для ввода символа – getc() и fgetc(). Функция getc( ) используется для чтения символа из потока, открытого на чтение с помощью fopen( ). Прототип getc( ) следующий:
 
 int getc(FILE *fp);
 
 где fp – это указатель на файл типа FILE *, возвращенный fopen(). Функция getc( ) возвращает EOF при достижении конца файла. Для чтения текстового файла до конца следует использовать следующий код:
 
 ch = getc(fp);
 while( ch != EOF) { ch = getc(fp); }
 
 fclose( )
 
 Функция fclose( ) используется для закрытия потока, ранее открытого с помощью fopen( ). Она сохраняет в файл данные, находящиеся в дисковом буфере, и выполняет операцию системного уровня по закрытию файла.
 Функция fclose( ) имеет прототип:
 
 int fclose(FILE *fp);
 
 где fp – это указатель на файл возвращённый fopen( ). Если возвращён 0, то операция закрытия была выполнена успешно, а если EOF, то, значит, была ошибка.
 
 
 Использование feof( )
 
 Когда файл открыт для двоичного ввода, может быть прочитано значение равное EOF. В результате getc( ) будет отображать состояние конца файла, хотя конец файла не достигнут. Для разрешения этой проблемы в С имеется функция feof( ).
 Её прототип:
 
 int feof(FILE *fp);
 
 где fp – идентифицирует файл. Функция feof() возвращает не 0, если достигнут конец файла, в противном случае она возвращает 0. Следующий код читает двоичный файл, пока не встретится конец файла:
 
 while(!feof(fp)) ch = getc(fp);
 Следующая программа копирует файл любого типа. Файлы открываются в двоичном режиме, и feof() используется для проверки наличия конца файла:
 
 #include <stdio.h>
 #include <string.h>
 int main(int argc, char *argv[])
 {
 FILE *in, *out;
 char ch, p[1025], p1[1025];
 
 puts("Input filename");
 fgets(p,1025,stdin);
 if(p[strlen(p)-1] == '\n') p[strlen(p)-1]='\0';
 printf("Length of filename now = %lu\n", strlen(p));
 
 puts("Output filename");
 fgets(p1,1025,stdin);
 if(p1[strlen(p1)-1] =='\n') p1[strlen(p1)-1]='\0';
 printf("Length of filename now = %lu\n", strlen(p1));
 
 if((in=fopen(p, "rb")) == NULL) {
 printf("Cannot open source file.");
 return 1;
 }
 if((out=fopen(p1, "wb")) == NULL) {
 printf("Cannot open destination file.");
 return 1;
 }
 
 
 while(!feof(in)) {
 ch = getc(in);
 if(!feof(in)) putc(ch, out);
 }
 fclose(in);
 fclose(out);
 return 0;
 }
 
 Работа со строками: fgets() и fputs()
 Файловая система ввода-вывода С содержит две функции, которые могут читать или писать строки в поток – fgets() и fputs(). Они имеют следующие прототипы:
 
 int fputs(const char *str, FILE *fp);
 char *fgets(char *str, int длина, FILE *fp);
 
 Функция fputs() подобна puts(), за исключением того, что она пишет строку в указанный поток. Функция fgets() читает строку из указанного потока, пока не встретится символ новой строки или не будет прочитано (длина-1) символов. Если прочитан символ новой строки, то он станет частью строки. В обоих случаях результирующая строка завершается нулевым символом. Функция возвращает str в случае успеха и нулевой указатель - в случае ошибки.
 Можно использовать fgets() для чтения строки с клавиатуры. Чтобы сделать это, надо использовать stdin как указатель на файл. Например:
 
 #include <stdio.h>
 #include <string.h>
 int main(int argc, char *argv[])
 {
 char s[80];
 printf("Enter a string: ");
 fgets(s, 80, stdin);
 if(s[strlen(s)-1] == '\n') s[strlen(s)-1]='\0';
 puts(s);
 return 0;
 }
 
 fread( ) и fwrite( )
 
 Файловая система предоставляет две функции, позволяющие читать и писать блоки данных - fread( ) и fwrite( ). Их прототипы:
 
 size_t fread(void *буфер, size_t число_байт, size_t объём, FILE *fp);
 
 size_t fwrite(const void *буфер, size_t число_байт, size_t объём, FILE *fp);
 
 В случае fread() буфер – это указатель на область памяти, которая получает данные из файла. В случае fwrite() буфер – это указатель на информацию, записываемую в файл. Длина каждого элемента в байтах определяется в число_байт. Аргумент объём определяет, сколько элементов (каждый длиной число_байт) будет прочитано или записано. fp – это указатель на ранее открытый поток.
 Функция fread( ) возвращает число прочитанных элементов. Данное значение может быть меньше, чем объём, если раньше был достигнут конец файла или произошла ошибка. Функция fwrite( ) возвращает число записанных элементов. Данное значение равно объём, если не возникла ошибка.