Чтение символа

 

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