2009-06-20 16 views
20

Je suis en train de créer un fichier texte temporaire en C++, puis le supprimer à la fin du programme. Je n'ai pas eu beaucoup de chance avec Google.Comment créer un fichier texte temporaire en C++?

Pourriez-vous me dire quelles fonctions utiliser?


Les réponses ci-dessous indiquent comment créer un fichier temporaire. Que faire si je veux juste créer un fichier (tmp.txt), puis le supprimer? Comment ferais-je cela?

+0

puis supprimez-le à la fin du fichier? – Tom

+0

Oui. Le fichier temporaire contiendra uniquement des données temporaires. La sortie sera écrite dans un fichier output.txt existant. – Meir

+0

http://www.cplusplus.com/doc/tutorial/files/ – g06lin

Répondre

21

Peut-être que cela vous aidera

FILE * tmpfile (void); 

http://www.cplusplus.com/reference/clibrary/cstdio/tmpfile/

Ouvrir un fichier temporaire

crée un fichier binaire temporaire, ouvert pour la mise à jour (wb + Mode - voir fopen pour détails). Le nom de fichier est garanti pour être différent de tout autre fichier existant . Le fichier temporaire créé est automatiquement supprimé lorsque le flux est fermé (fclose) ou lorsque le programme se termine normalement.

Voir aussi

char * tmpnam (char * str); 

Generate nom de fichier temporaire

Une chaîne contenant un nom de fichier différent de tout fichier existant est généré. Cette chaîne peut être utilisée pour créer un fichier temporaire sans en écrasant tout autre fichier existant.

http://www.cplusplus.com/reference/clibrary/cstdio/tmpnam/

+0

Ça a l'air génial. Merci. Je l'essaie ... – Meir

+4

Il est à noter qu'il peut y avoir des problèmes avec tmpfile() et tmpnam() dans certains contextes, par exemple, http://www.codeproject.com/KB/web-security/TemporaryFileSecurity. aspx – jfs

+2

Tmpfile, bien sûr, a le problème de renvoyer un handle de fichier C, pas un flux C++. – rlbond

2

Si vous avez besoin d'un fichier nommé (par exemple, vous pouvez transmettre le nom à un autre processus, peut-être un compilateur ou un éditeur), puis enregistrer une fonction de nettoyage qui supprime le fichier avec atexit(). Vous pouvez utiliser C++ <iostream> ou C FILE * (<cstdio>) pour créer le fichier. La fonction mkstemp() non complètement standard mais largement disponible crée un fichier et vous indique son nom ainsi que le renvoi d'un descripteur de fichier (un troisième mécanisme d'E/S); vous pouvez utiliser la fonction fdopen() pour convertir le descripteur de fichier en FILE *.

Si vous n'avez pas besoin d'un fichier nommé, un FILE * C-style est OK, alors regardez tmpfile() comme suggéré par @Tom.

19

Voici un exemple complet:

#include <unistd.h> 

int main(void) { 
    char filename[] = "/tmp/mytemp.XXXXXX"; // template for our file.   
    int fd = mkstemp(filename); // Creates and opens a new temp file r/w. 
           // Xs are replaced with a unique number. 
    if (fd == -1) return 1;  // Check we managed to open the file. 
    write(fd, "abc", 4);   // note 4 bytes total: abc terminating '\0' 
    /* ... 
    do whatever else you want. 
    ... */ 
    close(fd); 
    unlink(filename);    // Delete the temporary file. 
} 

Si vous connaissez le nom du fichier que vous voulez créer (et êtes sûr qu'il n'existe déjà), vous pouvez évidemment utiliser simplement open pour ouvrir le fichier .

tmpnam et tmpfile devraient probablement être évités car ils peuvent souffrir de conditions de course - voir man tmpfile(3) pour les détails.

+1

La page de manuel Linux pour mkstemp (3) indique que les 6 derniers caractères du nom de fichier doivent être XXXXXX. Voir http://www.kernel.org/doc/man-pages/online/pages/man3/mkstemp.3.html – jfs

+0

Hmm, la page de manuel OS X pour mkstemp indique que vous pouvez avoir un nombre variable de XXX. Cependant, par souci de clarté (et parce que la plupart des gens utilisent probablement Linux), j'ai changé l'exemple ci-dessus. – DaveR

+0

En fait, c'est mktemp et tmpnam qui souffrent des conditions de course que vous mentionnez, pas tmpfile. tmpfile renvoie le descripteur de fichier C, de sorte que vous n'obtiendrez pas de flux C++, mais vous n'obtenez pas non plus de condition de concurrence. Je pense que les pages de manuel que vous voulez faire référence ci-dessus sont pour tmpname (3) http://www.kernel.org/doc/man-pages/online/pages/man3/tmpnam.3.html et mktemp http: // www .kernel.org/doc/man-pages/online/pages/man3/mktemp.3.html –

0

Bien, en supposant que vous ayez réussi à créer le fichier temporaire, vous pouvez utiliser la fonction remove pour le supprimer.

La fonction est déclarée dans stdio.h -

#include <stdio.h> 

int remove(const char *pathname); 

Par exemple, si vous voulez supprimer un fichier nommé myfile.txt le code sera

#include<stdio.h> 

int main() 
{ 
    if(remove("myfile.txt") == -1) 
    { 
    fprintf(stderr,"Remove failed"); 
    exit(EXIT_FAILURE); 
    } 
    exit(EXIT_SUCCESS); 
} 

J'espère que maintenant, vous savez déjà comment créer le fichier temporaire, cela devrait résoudre votre requête. J'espère que ça aide.

1

Je me demande pourquoi la plupart d'entre vous lui ont montré la manière C de le faire au lieu de la façon C++.
Voici fstream.
Essayez cela, la suppression d'un fichier dépend du système d'exploitation, mais vous pouvez utiliser boost.filesystem pour vous faciliter la tâche.

+2

C'est probablement parce que l'OP a demandé un fichier temporaire, et qu'il n'y a pas de mécanisme C++ standard pour créer un nom de fichier unique. Il n'y a rien dans libstdC++ ou boost qui remplace vraiment mkstemp(). – Tom

5

Cela peut être un peu hors sujet parce que l'auteur voulait créer un fichier tmp.txt et le supprimer après l'avoir utilisé, mais c'est trivial - vous pouvez simplement l'ouvrir() et le supprimer (en utilisant boost :: filesystem bien sûr).

mkstemp() est basé sur UNIX. Avec Windows, vous utilisez GetTempFileName() et GetTempPath() pour générer un chemin d'accès à un fichier temporaire. Exemple de code de MSDN:

http://msdn.microsoft.com/en-us/library/aa363875%28VS.85%29.aspx

3

Sur Linux (en commençant par le noyau 3.11), il y a le drapeau pour ouvrir (2) O_TMPFILE qui crée un fichier temporaire qui n'a pas de nom (il ne montre pas dans le système de fichiers). Cela a quelques caractéristiques intéressantes:

  • Pas de soucis sur les noms uniques, c'est juste un inode, il n'y a pas de nom.
  • Aucune condition de concurrence lors de la création (par exemple des attaques de liens symboliques).
  • Pas de fichiers parasites si votre application plante, elle est toujours automatiquement supprimée.
Questions connexes