Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LektsiiS.doc
Скачиваний:
88
Добавлен:
13.04.2015
Размер:
815.1 Кб
Скачать

11.4 Ввод и вывод строк

Чтение строки из потока выполняется функцией

char *fgets(

char *s, // указатель на буфер, принимающий строку

int n, // предельное количество читаемых символов (обычно размер буфера)

FILE *stream

) — возвращает указатель на буфер или NULL при ошибке.

Чтение прекращается, когда достигнут конец строки или прочитано n-1 символов из файла. Строка в буфере замыкается нулевым символом. Указатель файла перемещается за символы CR-LF.

Запись строки в поток выполняется функцией

char *fputs(

char *s, // указатель на строку

FILE *stream

) — возвращает указатель на последний записанный символ или EOF при ошибке. Терминальный символ строки не копируется. Символы CR-LF добавляются в файл.

З а д а ч а. Скопировать текстовый файл xxx.txt в файл yyy.txt по строкам.

Р е ш е н и е.

#include <stdio.h>

void main() {

const int n = 100;

char buf [n];

FILE *in = fopen ("noname00. cpp","r");

FILE *out = fopen ("noname00. 000","w");

if (!in) return;

while (!feof(in)) {

fgets(buf, n, in);

fputs(buf, out);

}

fcloseall();

}

11.5 Ввод и вывод записей

Чтение записей из потока выполняется функцией

size_t fread(

void *ptr, // указатель на буфер в памяти, принимающий записи

size_t size, // размер записи в байтах

size_t n, // количество читаемых записей

FILE *stream

) — при удаче возвращает n, при неудаче — количество прочитанных записей, возможно нулевое. Общее количество читаемых байтов равно n * size.

Вывод записей в поток выполняется функцией

size_t fwrite(

const void *ptr,

size_t size,

size_t n,

FILE*stream

) — добавляет указанное количество записей в файл. Смысл параметров и возвращаемого значения тот же, что в функции fread.

11.6 Управление указателем файла

Чтение и запись выполняются в том месте файла, где находится указатель файла. Установить указатель можно функцией

int fseek(FILE *stream,

long offset, // смещение указателя

int whence // отсчет смещения

) — возвращает 0 при успехе. При ошибке, вызванной невозможностью открыть файл или устройство, возвращает ненулевое значение. Другие ошибки не диагностируются.

Для указания точки отсчета смещения используют константы:

SEEK_SET = 0 — отсчет от начала файла;

SEEK_CUR = 1 — отсчет от конца файла;

SEEK_END = 2 — отсчет от текущей позиции указателя.

Функция

long ftell(FILE *stream

) — возвращает текущую позицию указателя. При ошибке возвращает -1 и устанавливает глобальную переменную errno в ненулевое значение.

З а м е ч а н и е. Те же действия выполняются функциями fsetpos и fgetpos.

З а д а ч а. Определить длину файла в текстовом и двоичном режиме.

11.7 Состояние потока

Макрос, проверяющий достижение конца файла потока:

int feof (FILE *stream) — возвращает не 0, если достигнут конец файла и 0 — в противном случае.

Макрос, тестирующий индикатор ошибки потока:

int ferror(FILE *stream) — возвращает не 0, если обнаружена ошибка записи или чтения.

Однажды установленный индикатор ошибки сохраняется до выполнения функций clearerr, rewind или закрытия потока. Индикатор “конец файла” переустанавливается каждой операцией чтения.

void clearerr(FILE *stream) — обнуляет индикаторы ошибки и конца файла.

void rewind(FILE *stream) — делает то же, что clearerr, а также устанавливает указатель в начало файла.

При возникновении ошибки глобальная переменная errno (определена в файлах errno.h, stddef.h, stdlib.h) получает ненулевой номер ошибки.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]