10

一時ファイルを使用するプログラムをPOSIXFILEからC++標準ライブラリのiostreamに移行しています。mkstempの正しい代替手段は何ですか?

4

3 に答える 3

6

なにもない。mkstempこれはC(少なくともC99)またはC ++標準の一部ではないことに注意してください—これはPOSIXの追加です。C ++には、Cライブラリ部分のみが含まtmpfiletmpnamています。

ただし、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;
于 2011-10-15T16:04:51.777 に答える
5

ポータブルC++ソリューションが必要な場合は、boost :: filesystem:でunique_pathを使用する必要があります。

unique_path関数は、ディレクトリを含む一時ファイルの作成に適したパス名を生成します。この名前は、パーセント記号文字を使用してランダムな16進数による置換を指定するモデルに基づいています。[注:生成されたパス名のランダム性が高いほど、以前に存在したり推測されたりする可能性は低くなります。モデル内の各置換16進数は、4ビットのランダム性を追加します。したがって、デフォルトモデルは64ビットのランダム性を提供します。ほとんどのアプリケーションではこれで十分です

于 2011-10-15T17:23:14.227 に答える
4

それを行うための移植可能な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()
于 2011-10-15T16:07:03.157 に答える