Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Чтение из файла и запись в файл



Для обслуживания потоков, определяющих файлы на дисках используются функции библиотеки языка С:

- чтение одного символа из файла:

int fgetc(FILE *stream);

int getc(FILE *stream);

- запись одного символа в файл:

int fputc(int c, FILE *stream);

int putc(int c, FILE *stream);

- форматированный вывод в файл:

int fprintf(FILE *stream, const char *format[, argument, ...]);

- форматированный ввод из файла:

int fscanf(FILE *stream, const char *format[, address, ...]);

- чтение строки из файла:

char *fgets(char *str, int n, FILE *stream);

- запись строки в файл:

int fputs(const char *str, FILE *stream);

- чтение из файла порции данных:

size_t fread(void *ptr, size_t size, size_t n, FILE *stream);

- запись в файл порции данных:

size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);

 

Функция fputs записывает строку str в файл, заданный указателем stream на поток, и возвращает неотрицательное целое. При ошибках функция возвращает значение EOF. Символ конца строки - '\0' в файл не переносится, и символ '\n' в файл не записывается.

Функция fgets читает из определяемого указателем stream файла не более (n - 1) символов и записывает их в строку str. Функция прекращает чтение, как только прочтет (n - 1) символов или встретит символ новой строки '\n', который переносится в строку str. При ошибках или при достижении конца файла, при условии, что из файла не прочитан ни один символ, функция возвращает значение NULL. Следует особо отметить, что в отличие от функции строкового ввода из стандартного потока (gets()) данная функция не отбрасывает символ '\n'.

Функция fread() считывает из файла, определяемого указателем потока stream, в область памяти, определяемую указателем ptr n элементов размером по size байтов каждый. Функция возвращает число действительно прочитанных элементов. Если число элементов меньше заказанного (count), то это свидетельствует либо о достижении конца файла, либо об ошибке чтения. Чтобы проанализировать эту ситуацию можно воспользоваться функциями feof() или ferror(). Если файл открыт в текстовом режиме, то осуществляется замена символов конца строки ('\r\n' à '\n').

Функция fwrite() записывает n элементов, по size байтов каждый, из области памяти, задаваемой указателем ptr в поток stream. Функция возвращает число действительно записанных элементов. Если возвращаемое значение меньше заказанного (n) - то это свидетельствует о возникшей ошибке.

 

Позиционирование в потоке.

Выполнение всех обменных операций с потоком связано с понятием текущей позиции в потоке. Начальная позиция чтения-записи установливается при открытии потока и может соответствовать либо первому байту файла (для режимов "write" или "read"), либо конечному (за последним байтом) (для режима "append"). При выполнении операций ввода-вывода текущая позиция в потоке меняется в соответствии с количеством прочитанных или записанных байтов.

Программисту даются средства для управления позиционированием в потоках, связанных с файлами (но не потоков, связанных с устройствами! Например, стандартных).

Функция fseek() позволяет установить указатель текущей позиции в потоке на нужный байт. Прототип этой функции:

int fseek( FILE *stream, long offset, int origin );

здесь offset - смещение, может быть как отрицательным так и положительным, т.е. возможно изменение текущей позиции по файлу и вперед, и назад;

origin - начало отсчета - задается при помощи одной из предопределенных констант:

SEEK_SET () - начало файла (значение 0);

SEEK_CUR () - текущая позиция (значение 1);

SEEK_END ()- конец файла (значение 2).

Примеры:

fseek(fp,0L,SEEK_SET); // Перемещение к началу файла (из любой позиции)

fseek(fp,0L,SEEK_END); // Перемещение к концу файла (из любой позиции)

fseek(fp,-2L,SEEK_СUR); // Возврат на два байта от текущей позиции

fseek(fp,12L,SEEK_СUR); // Пропуск 12 байтов от текущей позиции

Для получения значения указателя текущей позиции в потоке служит функция

long ftell( FILE *stream);

Пример:

long pos;

FILE * fp;

...

pos = ftell(fp);//Запомнить текущую позицию

...

fseek(fp, pos, SEEK_SET);// Восстановить запомненное значение

...

 




©2015 studopedya.ru Все права принадлежат авторам размещенных материалов.