c++filefile-iomkstemp

How to create a std::ofstream to a temp file?


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?


Solution

  • 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.