ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4279
Скачиваний: 28
Глава 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);
Часть 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
и возвращает указатель на эту
строку.
Г Л А В А
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
. В случае
Часть 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
уста-
навливает контрольную точку в программе, в которой сохраняет-
Глава 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;
}