Namespaces
Variants

std:: tmpfile

From cppreference.net
< cpp ‎ | io ‎ | c
Definiert in Header <cstdio>
std:: FILE * tmpfile ( ) ;

Erstellt und öffnet eine temporäre Datei mit einem eindeutigen automatisch generierten Dateinamen.

Die Datei wird als Binärdatei zum Update geöffnet (wie durch std::fopen mit Zugriffsmodus "wb+" ). Mindestens TMP_MAX Dateien können während der Lebensdauer eines Programms geöffnet werden (dieses Limit kann mit std::tmpnam geteilt werden und kann durch FOPEN_MAX weiter eingeschränkt sein).

Wenn das Programm die Datei schließt, z.B. durch Ausführung von std::fclose , wird die Datei automatisch gelöscht.

Wenn das Programm normal terminiert (durch Aufruf von std::exit , Rückkehr aus main , etc.), werden alle Dateien, die durch Aufruf von std::tmpfile geöffnet wurden, ebenfalls automatisch gelöscht.

Wenn das Programm abnormal beendet wird, ist implementierungsdefiniert, ob diese temporären Dateien gelöscht werden.

Inhaltsverzeichnis

Parameter

(keine)

Rückgabewert

Der zugehörige Dateistream oder ein Nullzeiger, falls ein Fehler aufgetreten ist.

Hinweise

Auf einigen Implementierungen (z.B. älteren Linux-Versionen) erstellt diese Funktion tatsächlich eine Datei, öffnet sie und löscht sie sofort aus dem Dateisystem: Solange ein Programm einen offenen Dateideskriptor zu einer gelöschten Datei hält, existiert die Datei, aber da sie gelöscht wurde, erscheint ihr Name in keinem Verzeichnis, sodass kein anderer Prozess sie öffnen kann. Sobald der Dateideskriptor geschlossen wird oder das Programm beendet wird (normal oder abnormal), wird der von der Datei belegte Speicherplatz vom Dateisystem zurückgewonnen. Neuere Linux-Versionen (seit 3.11 oder später, abhängig vom Dateisystem) erstellen solche unsichtbaren temporären Dateien in einem Schritt über ein spezielles Flag im open() Syscall.

Auf einigen Implementierungen (z.B. Windows) sind erhöhte Berechtigungen erforderlich, da die Funktion die temporäre Datei möglicherweise in einem Systemverzeichnis erstellt.

Beispiel

#include <cstdio>
#include <cstdlib>
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main()
{
    std::cout << "TMP_MAX = " << TMP_MAX << '\n'
              << "FOPEN_MAX = " << FOPEN_MAX << '\n';
    std::FILE* tmpf = std::tmpfile();
    std::fputs("Hello, world", tmpf);
    std::rewind(tmpf);
    char buf[6];
    std::fgets(buf, sizeof buf, tmpf);
    std::cout << buf << '\n';
    // Linux-specific method to display the tmpfile name
    std::cout << fs::read_symlink(
                     fs::path("/proc/self/fd") / std::to_string(fileno(tmpf))
                 ) << '\n';
}

Mögliche Ausgabe:

TMP_MAX = 238328
FOPEN_MAX = 16
Hello
"/tmp/tmpfBlY1lI (deleted)"

Siehe auch

gibt einen eindeutigen Dateinamen zurück
(Funktion)
gibt ein Verzeichnis für temporäre Dateien zurück
(Funktion)
C-Dokumentation für tmpfile