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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: