Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
stdio_ВАНЯ.rtf
Скачиваний:
5
Добавлен:
20.07.2019
Размер:
588.72 Кб
Скачать

Int fwrite(const void* ptr, int size, int num, file* stream);

Каждое обращение к функции fwrite записывает в поток вывода, заданный указателем stream, не более, чем num элементов данных любого базового или абстрактного типа. Размер каждого элемента данных задает аргумент size. Указатель ptr адресует информационные структуры данных программы, которые требуется передать в поток вывода. Функция fwrite возвращает число реально записанных элементов данных, которое может быть меньше значения аргумента num только в случае ошибки.

Использование функций fread и fwrite для копирования содержимого файлов по блокам, размером BUFSIZ байтов, иллюстрирует следующий исходный код прикладной процедуры blockcopy:

/* Копирование файлов по блокам */

void blockcopy(FILE* input, FILE* output) {

unsigned char buf[BUFSIZ]; /* буфер копирования блока */

int size; /* зффективный размер блока */

/* Цикл копирования */

while((size = fread((void* ) buf, BUFSIZ, 1, input) > 0)

fwrite((const void* ) buf, size, 1, output);

} /* blockcopy */

В некоторых случаях при записи данных необходимо гарантировать передачу содержимого буфера потока в файл или на терминал до заполнения буфера. Чтобы принудительно вытолкнуть информацию из буфера потока применяется функция fflush. Спецификация формата ее вызова имеет вид:

Int fflush(file* stream);

Обычно, единственный аргумент stream функции fflush обозначает указатель потока вывода, в который требуется передать все буферизованные, но еще незаписанные данные. Если аргумент stream специфицирует поток ввода, то вызов функции fflush приводит к уничтожению всех буферизованных, но еще непрочитанных данных. В обоих случаях, при успешном завершении функция fflush возвращает нулевой код, а в случае ошибки ‑ значение EOF. Ошибка имеет место, если поток, специфицированный указателем stream, не связан ни с каким файлом.

Использование функции fflush поясняет исходный код прикладной процедуры beep, любой вызов которой гарантирует синхронный звуковой сигнал через стандартный вывод символа с кодом 7.

/* Звуковой сигнал */

void beep() {

putchar('\007'); /* стандартный вывод звукового символа */

fflush(stdout); /* очистка буфера стандартного вывода */

} /* beep */

Позиционирование в потоках ввода-вывода

Выполнение всех функций чтения и записи приводит к последовательному изменению текущей позиции ввода-вывода в потоке. Например, после вызова функции fgetc указатель позиции чтения в структуре управления потоком устанавливается за прочитанным символом. Аналогично, после обращения к функции fputc указатель позиции записи в структуре управления потоком будет установлен после записанного символа. Чтобы обеспечить установку произвольной позиции ввода-вывода в файловом потоке, следует применять функцию fseek. Спецификация формата ее вызова имеет вид:

Int fseek(file* stream, long offset, int whence);

Аргумент stream специфицирует файловый поток, где нужно позиционировать операции ввода или вывода. Аргумент offset задает смещение в байтах новой позиции ввода-вывода в файле, с которым связан поток. В зависимости от значения аргумента whence смещение исчисляется от начала файла, текущей позиции или от конца файла. Чтобы декларировать нужный способ смещения, используются макросы SEEK_SET, SEEK_CUR и SEEK_END, которые обычно определены в заголовочном файле stdio.h значениями 0, 1 и 2, соответственно.

Спецификация аргумента whence значением SEEK_END обычно имеет смысл в сочетании с отрицательной величиной параметра смещения offset. В этом случае сдвиг текущей позиции ввода-вывода исчисляется в направлении от конца файла к его началу. Если аргумент offset задает нулевое смещение (0L), а значение аргумента whence равно SEEK_END, позиция ввода или вывода устанавливается в конец файла. Последующее обращение к функция записи данных в поток эквивалентно добавлению новой информацию в конец файла.

Функция fseek допускает установку позиции вывода за концом файла. Это не приводит к увеличению размера файла до записи данных с установленной позиции вывода. Полученный промежуток будет читаться как нулевые байты, пока в него не будет что-либо записано.

Спецификация аргумента whence значением SEEK_SET обычно имеет смысл в сочетании с положительной величиной параметра смещения offset. В этом случае сдвиг текущей позиции ввода-вывода исчисляется в направлении от начала файла к его концу. Если аргумент offset задает нулевое смещение (0L), а значение аргумента whence равно SEEK_SET, позиция ввода-вывода устанавливается в начало файла.

Установка позиции ввода-вывода перед началом файла считается ошибкой позиционирования. В этом случае функция fseek возвращает отрицательное значение. При успехе позиционирования функция fseek возвращает нулевой код.

Чтобы избежать ошибок позиционирования указателя файлового потока в начало файла, рекомендуется использовать функцию rewind. Спецификация формата ее вызова имеет вид:

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