ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4280
Скачиваний: 28
Часть III. Стандартная библиотека языка программирования C
366
printf("%c\n", c); /* c */
printf("%d\n", n); /* 10 */
printf("%g\n", d); /* 1.2 */
printf("%s\n", s); /* String */
return 0;
}
30.14. Работа с буферами
Буфером
называется область оперативной памяти, используемая
потоком для временного хранения данных из файла. Для работы
с буферами используются функции
setvbuf
,
setbuf
,
fflush
.
Для создания буфера потока и установки режимов работы с этим
буфером используется функция
setvbuf
, которая имеет следую-
щий прототип:
int setvbuf(FILE* stream, char* buf, int mode, size_t size);
Вызывается эта функция после открытия файла, но перед досту-
пом к нему. При успешном завершении функция возвращает зна-
чение
0
, а в случае неудачи — ненулевое значение.
Параметр
stream
задает поток, для которого устанавливается
буфер.
Параметр
buf
указывает на блок памяти для буфера. Если этот
параметр равен
NULL
, то функция
setvbuf
использует функцию
malloc
для распределения памяти под буфер.
Параметр
mode
определяет режим работы с буфером и может
принимать следующие значения:
_IOFBF
— вывод данных из буфера во внешнюю память вы-
полняется только при полной загрузке буфера или при за-
крытии файла;
_IOLBF
— вывод данных из буфера во внешнюю память вы-
полняется при записи в буфер символа
‘\n’
;
_IONBF
— нет буферизации, в этом случае параметры
size
и
buf
игнорируются.
Параметр
size
определяет длину буфера в байтах.
Глава 30. Функции для работы с файлами <stdio.h>
367
Для создания буфера потока может также использоваться функ-
ция
setbuf
, которая имеет следующий прототип:
int setbuf(FILE* stream, char* buffer);
Эта функция вызывает функцию
setvbuf
. Причем если значение
параметра
buffer
не равно
NULL
, то функция
setvbuf
вызывается
следующим образом:
setvbuf(stream, buffer, _IOFBF, BUFSIZ);
Макрос
BUFSIZ
задает длину буфера по умолчанию. Этот макрос
описан в заголовочном файле stdio.h. В противном случае функ-
ция
setvbuf
вызывается следующим образом:
setvbuf(stream, 0, _IOFBF, BUFSIZE);
То есть в этом случае буферизация не используется.
Для сброса данных из буфера в файл предназначена функция
fflush
, которая имеет следующий прототип:
int fflush(FILE* stream);
Эта функция записывает данные из буфера потока
stream
в со-
единенный с этим потоком файл. В случае успешного завершения
функция возвращает значение
0
, а в случае неудачи —
EOF
. Если
значение параметра
stream
равно
NULL
, то освобождаются буферы
всех потоков, которые работают в режиме вывода.
В листинге 30.11 приведен пример создания буфера потока.
Листинг 30.11. Создание буфера потока
#include <stdio.h>
#define SIZE 1024 /* размер буфера */
int main()
{
int code;
char name[80];
double salary = 0.0;
FILE* out; /* выходной поток */
char buffer[SIZE]; /* буфер потока */
Часть III. Стандартная библиотека языка программирования C
368
/* открываем выходной поток в текстовом режиме */
out = fopen("employee.txt", "w");
/* создаем буфер для потока */
if(setvbuf(out, buffer, _IOFBF, SIZE))
{
printf("Set buffer failed.\n");
return 0;
}
printf("Input code, name and salary.\n");
printf("Press Ctrl+z to exit.\n");
printf(">");
/* вводим первую запись с консоли */
scanf("%d%s%lf", &code, &name, &salary);
while (!feof(stdin))
{
/* пишем запись в файл */
fprintf(out, "%d %s %f ", code, name, salary);
printf(">");
/* вводим следующие записи с консоли */
scanf("%d%s%lf", &code, &name, &salary);
}
/* закрываем выходной поток */
fclose(out);
return 0;
}
30.15. Стандартные потоки
Каждой программе предоставляются три стандартных потока,
которые по умолчанию соединены с консолью. Указатели на дан-
ные потоки возвращают макроcы
stdout
,
stdin
,
stderr
. Поэтому
эти потоки также называются
stdout
,
stdin
,
stderr
.
Глава 30. Функции для работы с файлами <stdio.h>
369
Поток
stdout
предназначен для вывода данных на консоль. Для
работы с этим потоком используются функции
putchar
,
puts
и
printf
, которые имеют следующие прототипы:
int putchar(int c); /* вывод символа */
int puts(const char* str); /* вывод строки */
int printf(const char *format, ...); ./* форматирование */
Работают эти функции так же, как и соответствующие функции
для записи данных в файл.
Поток
stdin
предназначен для ввода данных с консоли. Для рабо-
ты с этим потоком используются функции
getchar
,
gets
и
scanf
,
которые имеют следующие прототипы:
int getchar(void); /* ввод символа */
char* gets(char* str); /* ввод строки */
int scanf(const char *format, ...); /* форматирование */
Работают эти функции так же, как и соответствующие функции
для чтения данных из файла.
Поток
stderr
предназначен для вывода сообщений об ошибках на
консоль. Для работы с этим потоком используется функция
perror
, которая имеет следующий прототип:
void perror(const char* str);
Параметр
str
указывает на строку, содержащую сообщение об
ошибке.
30.16. Удаление файла
Для удаления файла предназначена функция
remove
, которая име-
ет следующий прототип:
int remove(const char* filename);
Эта функция удаляет файл с именем
filename
. Если файл открыт,
то работа функции зависит от реализации. В случае успешного
завершения функция возвращает
0
, а в случае неудачи — ненуле-
вое значение.
В листинге 30.12 приведен пример удаления файла.
Часть III. Стандартная библиотека языка программирования C
370
Листинг 30.12. Удаление файла
#include <stdio.h>
int main()
{
if(remove("employee.bin"))
{
printf("There is no such a file.\n");
return 0;
}
printf("The file was deleted.\n");
return 0;
}
30.17. Переименование файла
Для переименования файла предназначена функция
rename
, кото-
рая имеет следующий прототип:
int rename(const char* old_name, const char* new_name);
Эта функция переименовывает файл с именем
old_name
в файл
с именем
new_name
. Если файл с именем
new_name
уже существует,
то работа функции зависит от реализации. В случае успешного
завершения функция возвращает
0
, а в случае неудачи — ненуле-
вое значение.
В листинге 30.13 приведен пример переименования файла.
Листинг 30.13. Переименование файла
#include <stdio.h>
int main()
{
if(rename("employee.txt", "emp.txt"))
{
printf("There is no such a file.\n");
return 0;
}