Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 47

Автор НСйл ΠœΡΡ‚ΡŒΡŽ

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, обычная Π΄Π°Ρ‚Π°, такая ΠΆΠ΅, ΠΊΠ°ΠΊ получСнная ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ date, соотвСтствуСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strftime:

"%a %b %d %Н: %М: %S %Y"

Для облСгчСния чтСния Π΄Π°Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ strptime, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΡƒΡŽ строку с Π΄Π°Ρ‚ΠΎΠΉ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΈ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ структуру tm с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ Π΄Π°Ρ‚ΠΎΠΉ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ:

#include <time.h>

char *strptime(const char *buf, const char *format, struct tm *timeptr);

Π‘Ρ‚Ρ€ΠΎΠΊΠ° format конструируСтся Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ одноимСнная строка Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strftime. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΉ strptime дСйствуСт Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sscanf: ΠΎΠ½Π° сканируСт строку Π² поискС ΠΎΠΏΠΎΠ·Π½Π°Π²Π°Π΅ΠΌΡ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ ΠΈ записываСт ΠΈΡ… Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС это элСмСнты структуры tm, которая заполняСтся Π² соотвСтствии со строкой format. Однако спСцификаторы ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ для strptime Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ мягчС спСцификаторов Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strftime. Π’Π°ΠΊ, Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strptime Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ ΠΊΠ°ΠΊ сокращСнныС, Ρ‚Π°ΠΊ ΠΈ ΠΏΠΎΠ»Π½Ρ‹Π΅ названия Π΄Π½Π΅ΠΉ ΠΈ мСсяцСв. Π›ΡŽΠ±ΠΎΠ΅ ΠΈΠ· этих прСдставлСний Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ спСцификатору %a Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strptime. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ функция strftime для прСдставлСния чисСл, ΠΌΠ΅Π½ΡŒΡˆΠΈΡ… 10, всСгда примСняСт Π²Π΅Π΄ΡƒΡ‰ΠΈΠ΅ Π½ΡƒΠ»ΠΈ, strptime считаСт ΠΈΡ… Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ.

Ѐункция strptime Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° символ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π·Π° послСдним, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΌ Π² процСссС прСобразования. Если ΠΎΠ½Π° встрСчаСт символы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Ρ‹, Π² этой Ρ‚ΠΎΡ‡ΠΊΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ просто прСкращаСтся. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² структуру tm записаны Π·Π½Π°Ρ‡ΠΈΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ слСдуСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, достаточно Π»ΠΈ символов строки принято ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ.

Рассмотрим Ρ€Π°Π±ΠΎΡ‚Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ (ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 4.9).

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 4.9. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ strftime ΠΈ strptime

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π²Ρ‹Π±ΠΎΡ€ спСцификаторов ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅:

#include <time.h>

#include <stdio.h>

#include <stdlib.h>


int main() {

 struct tm *tm_ptr, timestruct;

 time_t the_time;

 char buf[256];

 char *result;

 (void)time(&the_time);

 tm_ptr = localtime(&the_time);

 strftime(buf, 256, "%A %d %B, %I:%S %p", tm_ptr);

 printf("strftime gives: %s\n", buf);

 strcpy(buf, "Thu 26 July 2007, 17:53 will do fine");

 printf("calling strptime with: %s\n", buf);

 tm_ptr = &timestruct;

 result = strptime(buf, "%a %d %b %Y, %R", tm_ptr);

 printf("strptime consumed up to: %s\n", result);

 printf("strptime gives:\n");

 printf ("date: %02d/%02d/%02d\n",

  tm_ptr->tm_year % 100, tm_ptr->tm_mon+1, tm_ptr->tm_mday);

 printf("time: %02d:%02d\n",

  tm_ptr->tm_hour, tm->ptr->tm_min);

 exit(0);

}

Когда Π²Ρ‹ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ strftime.c, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

$ ./strftime

strftime gives: Saturday 09 June, 08:16 AM

calling strptime with: Thu 26 July 2007, 17:53 will do fine

strptime concurred up to: will do fine

strptime gives:

date: 07/07/26

time: 17:53

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° strftime ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ мСстноС врСмя с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ time ΠΈ localtime. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ Π² ΡƒΠ΄ΠΎΠ±ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strftime с подходящим Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ форматирования. Для дСмонстрации примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strptime ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°Π΄Π°Π΅Ρ‚ строку, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ Π΄Π°Ρ‚Ρƒ ΠΈ врСмя, Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ strptime для извлСчСния Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΡ… Π½Π° экран. Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ прСобразования %R Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strptime β€” это сокращСнноС ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ %Н:%M.

Π’Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ для ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ просмотра Π΄Π°Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strptime Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° точная строка Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ½Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΄Π°Ρ‚Ρ‹, считываСмыС ΠΈΠ· строк, Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ, Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ строго Π²Ρ‹Π²Π΅Ρ€Π΅Π½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€ΠΈ компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ strftime.c Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ компилятора. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ GNU Π½Π΅ объявлСна функция strptime. Для устранСния ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ слСдуСт явно Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ срСдства стандарта X/Open, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку ΠΏΠ΅Ρ€Π΅Π΄ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ time.h:

#define _XOPEN_SOURCE

Π’Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹

Π—Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² возмоТности использования Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π² Π²ΠΈΠ΄Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ². Π’ Π½ΠΈΡ… ΠΌΠΎΠ³ΡƒΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ вычислСний, ΠΈΠ»ΠΈ Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹Π΅ ΠΊΠΎΠΏΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ², сдСланныС ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ критичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. НапримСр, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ записСй. Π’ Ρ„Π°ΠΉΠ»Π΅ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ элСмСнты Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Π½ΡƒΠΆΠ΄Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π² сохранСнии, ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π² ΠΊΠΎΠ½Ρ†Π΅ процСсса Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» становится Π½ΠΎΠ²ΠΎΠΉ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…, Π° исходная Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… удаляСтся.

Π£ ΡΡ‚ΠΎΠ»ΡŒ популярных Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π΅ΡΡ‚ΡŒ скрытый нСдостаток. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ прилоТСния Π²Ρ‹Π±ΠΈΡ€Π°Π»ΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ имя для Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. Если это условиС Π½Π΅ ΡΠΎΠ±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ, ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ОБ Linux β€” многозадачная систСма, другая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ самоС имя, ΠΈ ΠΎΠ±Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΌΠ΅ΡˆΠ°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ.

УникальноС имя Ρ„Π°ΠΉΠ»Π° гСнСрируСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ tmpnam:

#include <stdio.h>

char *tmpnam(char *s);

Ѐункция tmpnam Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ допустимоС имя Ρ„Π°ΠΉΠ»Π°, Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ любого ΠΈΠ· ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ². Если строка s Π½Π΅ Ρ€Π°Π²Π½Π° NULL, Π² Π½Π΅Π΅ Π±ΡƒΠ΄Π΅Ρ‚ записано имя Ρ„Π°ΠΉΠ»Π°. ΠŸΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ tmpnam Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡƒΡŽ для Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, поэтому Π²Π°ΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ строковый ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Ссли функция Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ. Π”Π»ΠΈΠ½Π° строки полагаСтся Ρ€Π°Π²Π½ΠΎΠΉ, ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, L_tmpnam (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠΊΠΎΠ»ΠΎ 20) символам. Ѐункция tmpnam ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π΄ΠΎ TMP_MAX (Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… тысяч) Ρ€Π°Π·, ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π°.

Если, Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» прСдполагаСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π½Π°Π·Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ tmpfile. Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ, Ρ‚.ΠΊ. другая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅, ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ tmpnam. Ѐункция tmpfile устраняСт эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ.

#include <stdio.h>

FILE* tmpfile(void);

Ѐункция tmpfile Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΡΡΡ‹Π»Π°ΡŽΡ‰ΠΈΠΉΡΡ Π½Π° ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ». Π€Π°ΠΉΠ» ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ для чтСния ΠΈ записи (с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ fopen с Ρ„Π»Π°Π³ΠΎΠΌ w+) ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски ΡƒΠ΄Π°Π»Π΅Π½, ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΊΡ€ΠΎΡŽΡ‚ΡΡ всС ссылки Π½Π° Π½Π΅Π³ΠΎ.

Π’ случаС возникновСния ошибки tmpfile Π²Π΅Ρ€Π½Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ NULL ΠΈ задаст Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ errno.

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим эти Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² дСйствии:

#include <stdio.h>

#include <stdlib.h>


int main() {

 char tmpname[L_tmpnam];

 char* filename;

 FILE *tmpfp;

 filename = tmpnam(tmpname);

 printf("Temporary file name is: %s\n", filename);

 tmpfp = tmpfile();

 if (tmpfp) printf("Opened a temporary file OK\n");

 else perror("tmpfile");

 exit(0);

}

Когда Π²Ρ‹ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ tmpnam.с, Ρ‚ΠΎ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π°, сгСнСрированноС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ tmpnam:

$ ./tmpnam

Temporary file name is: /tmp/file2S64zc

Opened a temporary file OK

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ tmpnam для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π½ΡƒΠΆΠ½ΠΎ быстро Π΅Π³ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ риск Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ другая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΡ‚ΠΊΡ€ΠΎΠ΅Ρ‚ Ρ„Π°ΠΉΠ» с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ. Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ tmpfile ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ создаСт ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Ρ‚Π΅ΠΌ самым устраняя этот риск. ΠŸΡ€ΠΈ компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ tmpnam, компилятор GNU Π‘ ΠΌΠΎΠΆΠ΅Ρ‚ вывСсти ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… вСрсиях UNIX прСдлагаСтся Π΄Ρ€ΡƒΠ³ΠΎΠΉ способ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠΌΠ΅Π½ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² β€” с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ mktemp ΠΈ mkstemp. Они ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΈ ОБ Linux ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ tmpnam Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ шаблон ΠΈΠΌΠ΅Π½ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ возмоТности управлСния мСстом хранСния ΠΈ ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„Π°ΠΉΠ»Π°.

#include <stdlib.h>

char *mktemp(char *template);

int mkstemp(char *template);

Ѐункция mktemp создаСт ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π° Π½Π° основС Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ шаблона template. АргумСнт template Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ строкой с ΡˆΠ΅ΡΡ‚ΡŒΡŽ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΌΠΈ символами Π₯. mktemp замСняСт эти символы Π₯ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ символов, допустимых Π² ΠΈΠΌΠ΅Π½Π°Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². Она Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ строку ΠΈΠ»ΠΈ NULL ΠΏΡ€ΠΈ нСвозмоТности ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ имя.

Ѐункция mkstemp Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ tmpfile: ΠΎΠ½Π° создаСт ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ». Имя Ρ„Π°ΠΉΠ»Π° гСнСрируСтся Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mktemp, Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ β€” ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ дСскриптор Ρ„Π°ΠΉΠ»Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π’ Π²Π°ΡˆΠΈΡ… собствСнных ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… слСдуСт всСгда ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ "ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ" tmpfile ΠΈ mkstemp вмСсто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ tmpnam ΠΈ mktemp.