Имеется две эквивалентные функции для ввода символа – 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( ) возвращает число записанных элементов. Данное значение равно объём, если не возникла ошибка.