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 を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。