一時ファイルを使用するプログラムをPOSIXFILE
からC++標準ライブラリのiostreamに移行しています。mkstempの正しい代替手段は何ですか?
3 に答える
なにもない。mkstemp
これはC(少なくともC99)またはC ++標準の一部ではないことに注意してください—これはPOSIXの追加です。C ++には、Cライブラリ部分のみが含まtmpfile
れtmpnam
ています。
ただし、Boost.IOStreamsfile_descriptor
はデバイスクラスを提供します。このクラスを使用して、返されるものを操作するストリームを作成できmkstemp
ます。
正しく思い出せば、次のようになります。
namespace io = boost::iostreams;
int fd = mkstemp("foo");
if (fd == -1) throw something;
io::file_descriptor device(fd);
io::stream<io::file_descriptor> stream(device);
stream << 42;
ポータブルC++ソリューションが必要な場合は、boost :: filesystem:でunique_pathを使用する必要があります。
unique_path関数は、ディレクトリを含む一時ファイルの作成に適したパス名を生成します。この名前は、パーセント記号文字を使用してランダムな16進数による置換を指定するモデルに基づいています。[注:生成されたパス名のランダム性が高いほど、以前に存在したり推測されたりする可能性は低くなります。モデル内の各置換16進数は、4ビットのランダム性を追加します。したがって、デフォルトモデルは64ビットのランダム性を提供します。ほとんどのアプリケーションではこれで十分です
それを行うための移植可能なC++の方法はありません。ファイルを作成する必要があり(これは、を使用して書き込み用にファイルを開くときに自動的に行われます) 、ファイルが終了したら(Cライブラリ関数removeを使用してofstream
)再度作成します。remove
ただし、を使用tmpnam
してファイルの名前を生成できます。
#include <fstream>
#include <cstdio>
char filename[L_tmpnam];
std::tmpnam(filename);
std::fstream file(filename);
...
std::remove(filename); //after closing, of course, either by destruction of file or by calling file.close()