Okay, mkstemp
is the preferred way to create a temp file in POSIX.
But it opens the file and returns an int
, which is a file descriptor. From that I can only create a FILE*, but not an std::ofstream
, which I would prefer in C++. (Apparently, on AIX and some other systems, you can create an std::ofstream
from a file descriptor, but my compiler complains when I try that.)
I know I could get a temp file name with tmpnam
and then open my own ofstream with it, but that's apparently unsafe due to race conditions, and results in a compiler warning (g++ v3.4. on Linux):
warning: the use of `tmpnam' is dangerous, better use `mkstemp'
So, is there any portable way to create an std::ofstream
to a temp file?
I think this should work:
char *tmpname = strdup("/tmp/tmpfileXXXXXX");
ofstream f;
int fd = mkstemp(tmpname);
f.attach(fd);
EDIT: Well, this might not be portable. If you can't use attach and can't create a ofstream directly from a file descriptor, then you have to do this:
char *tmpname = strdup("/tmp/tmpfileXXXXXX");
mkstemp(tmpname);
ofstream f(tmpname);
As mkstemp already creates the file for you, race condition should not be a problem here.