Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.12.2020

Просмотров: 4137

Скачиваний: 28

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Часть 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

 определяет длину буфера в байтах. 


background image

Глава 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];  /* буфер потока */ 


background image

Часть 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


background image

Глава 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 приведен пример удаления файла. 


background image

Часть 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; 
  } 


Смотрите также файлы