Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

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

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

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

Добавлен: 13.12.2020

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

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

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

Глава 30. Функции для работы с файлами <stdio.h> 

371 

  printf("The file was renamed.\n"); 
 
  return 0; 

30.18. Работа  
с временными файлами 

Для создания временного файла предназначена функция 

tmpfile

которая имеет следующий прототип: 

  FILE* tmpfile(void); 

Эта функция создает временный файл и открывает его в режиме 

"w+b"

. После закрытия потока временный файл удаляется. В слу-

чае  успешного  завершения  функция  возвращает  указатель  на 
файл, а в случае неудачи — 

NULL

В листинге 30.14 приведен пример создания временного файла. 

Листинг 30.14. Создание временного файла 

#include <stdio.h> 
int main() 

  FILE* temp;  /* временный файл */ 
  char s[] = "This is a string."; 
  char t[80]; 
 
  /* открываем временный файл */ 
  if(!(temp = tmpfile())) 
  { 
    printf("Create temp file failed.\n"); 
    return 1; 
  } 
  /* пишем строку во временный файл */ 
  fputs(s, temp); 
  /* устанавливаем индикатор позиции на начало файла */ 
  rewind(temp); 


background image

Часть III. Стандартная библиотека языка программирования C 

372 

  /* читаем строку из временного файла */ 
  fgets(t, 80, temp); 
  /* выводим строку на консоль */ 
  printf("%s\n", t); 
  /* закрываем временный файл */ 
  fclose(temp); 
 
  return 0; 

Для  получения  имени,  которое  может  быть  использовано  при 
создании  временного  файла,  предназначена  функция 

tmpnam

,  ко-

торая имеет следующий прототип: 

  char* tmpnam(char* str); 

Эта функция возвращает имя для временного файла. Максималь-
ное  количество  имен  равно  значению  макроса 

TMP_MAX

,  а  макси-

мальная  длина  имени  равна  значению  макроса 

L_tmpnam

.  Если 

значение параметра 

str

 равно 

NULL

, то функция возвращает указа-

тель на свою строку с именем файла. В противном случае функ-
ция  записывает  имя  в  строку 

str

  и  возвращает  указатель  на  эту 

строку. 

 


background image

  

 
 

Г Л А В А  

31 

 
 
 

Организация нелокальных 

переходов <setjmp.h> 

В  заголовочном  файле  setjmp.h  определен  тип  данных 

jmp_buf

макрос 

setjmp

  и  прототип  функции 

longjmp

,  которые  предназна-

чены для организации нелокальных переходов в программе. Дело 
в том, что с помощью инструкции 

goto

 можно передавать управ-

ление только внутри одной функции. Функция 

longjmp

 позволяет 

передавать управление в произвольную точку программы сквозь 
вызовы функций. 

31.1. Сохранение информации  

о состоянии стека 

Тип данных 

jmp_buf

 обычно определен следующим образом: 

  typedef int jmp_buf[_JBLEN]; 

Макрос 

_JBLEN

  определяет  длину  буфера,  который  предназначен 

для хранения информации о состоянии стека. 
Сохраняет  информацию  о  состоянии  стека  в  переменную  типа 

jmp_buf

    макрос 

setjmp

, определение которого имеет следующий 

вид: 

  #define setjmp(env) int_rvalue 

Параметр 

env

 должен иметь тип 

jmp_buf

, а 

int_rvalue

 представля-

ет  выражение,  которое  определяет  реализацию  этого  макроса  и 
результатом  его  вычисления  является 

rvalue

  типа 

int

.  В  случае 

  

 


background image

Часть III. Стандартная библиотека языка программирования C 

374 

успешного  сохранения  информации  о  состоянии  стека  результа-
том вычисления выражения 

int_rvalue

 является 

0

По  стандарту  макрос 

setjmp

  может  использоваться  только  в  вы-

ражениях: 

 

без операторов; 

 

с одним оператором 

!

 

с одним из операторов сравнения, вторым операндом которого 
является целочисленное константное выражение. 

Выражения  с  макрокомандой 

setjmp

  можно  использовать  в 

управляющих  инструкциях  и  в  выражении  с  оператором  при-
сваивания, которое является инструкцией. 
Часто  вместо  макроса 

setjmp

  используется  просто  функция 

setjmp

, которая имеет следующий прототип: 

  int setjmp(jmp_buf env); 

31.2. Нелокальный переход 

Нелокальный  переход  выполняется  при  помощи  функции 

longjump

, которая имеет следующий прототип: 

  void longjmp(jmp_buf env, int val); 

Параметр 

env

 должен содержать информацию о состоянии стека, 

которая была предварительно сохранена макрокомандой 

setjmp

, а 

значение параметра 

val

 будет использовано как значение макроса 

setjmp

Работает функция 

longjump

 следующим образом. Она возвращает 

управление  на  макрокоманду 

setjmp

,  которая  сохранила  состоя-

ние стека в переменной 

env

. Повторное выполнение макрокоман-

ды 

setjmp

  возвращает  значение,  которое  задано  в  параметре 

val

 

функции 

longjump

. Если значение параметра 

val

 равно 0, то мак-

рокоманда 

setjmp

 вернет значение 

1

. После этого управление пе-

редается на следующую за макрокомандой 

setjmp

 инструкцию. 

Другими словами можно сказать, что макрокоманда 

setjmp

 уста-

навливает контрольную точку в программе, в которой сохраняет-


background image

Глава 31. Организация нелокальных переходов <setjmp.h> 

375 

ся информация о состоянии стека, а функция 

longjump

 выполняет 

откат на эту контрольную точку. 
В листинге 31.1 приведен пример организации нелокального пе-
рехода. 

Листинг 31.1. Нелокальный переход 

#include <stdlib.h> 
#include <stdio.h> 
#include <setjmp.h> 
 
int *p = NULL; 
void fun(jmp_buf env) 

  p = malloc(sizeof(int)); 
  printf("Function is working\n"); 
  longjmp(env, 10); 

 
int main(void) 

  int val; 
  jmp_buf env; 
   
  val = setjmp(env); 
  if(val) 
  { 
    if (p) 
      free(p); 
    printf("Long jump value: %d\n", val);  /* 10 */ 
 
    return val; 
  } 
  printf("Long jump value: %d\n", val);    /* 0 */ 
  fun(env); 
   
  return 0; 


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