次の方法で共有


tmpnam_s、_wtmpnam_s

一時ファイルの作成に使用できる名前を生成します。 これらの関数は、「CRT のセキュリティ機能」に説明されているように、tmpnam と _wtmpnam のセキュリティが強化されたバージョンです。

errno_t tmpnam_s(
   char * str,
   size_t sizeInChars 
);
errno_t _wtmpnam_s(
   wchar_t *str,
   size_t sizeInChars 
);
template <size_t size>
errno_t tmpnam_s(
   char (&str)[size]
); // C++ only
template <size_t size>
errno_t _wtmpnam_s(
   wchar_t (&str)[size]
); // C++ only

パラメーター

  • [出力] str
    生成された名前を保持するポインター。

  • [入力] sizeInChars
    バッファーのサイズ (文字数)。

戻り値

これらの関数は両方とも、正常終了した場合は 0 を返し、失敗した場合はエラー番号を返します。

エラー条件

str

sizeInChars

戻り値

str の内容

NULL

any

EINVAL

変更されない

NULL 以外 (有効なメモリを指し示している)

短すぎる

ERANGE

変更されない

str が NULL の場合は、「パラメーターの検証」に説明されているように、無効なパラメーター ハンドラーが呼び出されます。 実行の継続が許可された場合、これらの関数は errno を EINVAL に設定し、EINVAL を返します。

解説

これらの関数はそれぞれ、現在存在していないファイルの名前を返します。 tmpnam_s は、現在の作業ディレクトリ内で一意の名前を返します。 \fname21 のように、ファイル名の前に円記号が付加され、パス情報がない場合は、そのファイル名が現在の作業ディレクトリに対して有効であることを示します。

tmpnam_s では、この生成されたファイル名を str に格納できます。 tmpnam_s によって返される文字列の最大長は、STDIO.H で定義されている L_tmpnam_s です。 str が NULL の場合、tmpnam_s は静的な内部バッファーに結果を残します。 したがって、その次の関数呼び出しにより、この値は破棄されます。 tmpnam_s で生成する名前は、プログラムで生成されたファイル名とファイル拡張子から成ります。2 回目以降の tmpnam_s 呼び出しでは、ファイル名に基数 32 の連番のファイル拡張子が付きます。STDIO.H の TMP_MAX_S が INT_MAX の場合は .1 ~ .1vvvvvu になります。

tmpnam_s は、オペレーティング システムから取得した OEM コード ページに基づいて自動的にマルチバイト文字列の引数を適宜処理して、マルチバイト文字シーケンスを認識します。 ワイド文字を扱う場合は、tmpnam_s ではなく _wtmpnam_s を使用します。_wtmpnam_s の場合、引数にはワイド文字列を指定します。また戻り値もワイド文字列です。 _wtmpnam_s と tmpnam_s の動作は、_wtmpnam_s がマルチバイト文字列を扱わない点を除いて同じです。

C++ では、テンプレートのオーバーロードによってこれらの関数を簡単に使用できます。オーバーロードでは、バッファー長を自動的に推論できるため、サイズ引数を指定する必要がなくなります。 詳細については、「セキュリティ保護されたテンプレート オーバーロード」を参照してください。

汎用テキスト ルーチンのマップ

TCHAR.H のルーチン

_UNICODE および _MBCS が未定義の場合

_MBCS が定義されている場合

_UNICODE が定義されている場合

_ttmpnam_s

tmpnam_s

tmpnam_s

_wtmpnam_s

必要条件

ルーチン

必須ヘッダー

tmpnam_s

<stdio.h>

_wtmpnam_s

<stdio.h> または <wchar.h>

互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。

使用例

// crt_tmpnam_s.c
// This program uses tmpnam_s to create a unique filename in the
// current working directory. 
//

#include <stdio.h>
#include <stdlib.h>

int main( void )
{   
   char name1[L_tmpnam_s];
   errno_t err;
   int i;

   for (i = 0; i < 15; i++)
   {
      err = tmpnam_s( name1, L_tmpnam_s );
      if (err)
      {
         printf("Error occurred creating unique filename.\n");
         exit(1);
      }
      else
      {
         printf( "%s is safe to use as a temporary file.\n", name1 );
      }
   }  
}

同等の .NET Framework 関数

該当なし標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。

参照

参照

ストリーム入出力

_getmbcp

malloc

_setmbcp

tmpfile_s