2009-06-20 62 views
20

Estoy tratando de crear un archivo de texto temporal en C++ y luego eliminarlo al final del programa. No he tenido mucha suerte con Google.¿Cómo crear un archivo de texto temporal en C++?

¿Podría decirme qué funciones usar?


Las respuestas a continuación me dicen cómo crear un archivo temporal. ¿Qué sucede si solo quiero crear un archivo (tmp.txt) y luego eliminarlo? ¿Como podría hacerlo?

+0

y luego eliminarlo al final del archivo? – Tom

+0

Sí. El archivo temporal solo contendrá datos temporales. La salida se escribirá en un archivo output.txt existente. – Meir

+0

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

Respuesta

21

Tal vez esto ayudará

FILE * tmpfile (void); 

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

Abrir un archivo temporal

Crea un archivo binario temporal, abierta para la actualización (WB + Modo - ver fopen para detalles) El nombre de archivo está garantizado para ser diferente de cualquier otro archivo existente . El archivo temporal creado se elimina automáticamente cuando la secuencia está cerrada (fclose) o cuando el programa finaliza normalmente.

Ver también

char * tmpnam (char * str); 

Generar nombre de archivo temporal

Una cadena que contiene un nombre de archivo diferente de cualquier archivo existente es generado. Esta cadena se puede usar para crear un archivo temporal sin sobrescribiendo cualquier otro archivo existente.

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

+0

Se ve muy bien. Gracias. Lo estoy probando ... – Meir

+4

Vale la pena mencionar que puede haber problemas con tmpfile() y tmpnam() en algunos contextos, por ejemplo, http://www.codeproject.com/KB/web-security/TemporaryFileSecurity. aspx – jfs

+2

Tmpfile, por supuesto, tiene el problema de devolver un identificador de archivo C, no una secuencia de C++. – rlbond

2

Si necesita un archivo con el nombre (por ejemplo, para que pueda pasar el nombre de otro proceso, tal vez un compilador o editor), y registrar una función de limpieza que elimina el archivo con atexit(). Puede usar C++ <iostream> o C FILE * (<cstdio>) para crear el archivo. La función mkstemp() no completamente estándar pero ampliamente disponible crea un archivo y le dice su nombre, además de devolver un descriptor de archivo (un tercer mecanismo de E/S); puede usar la función fdopen() para convertir el descriptor de archivo en FILE *.

Si no necesita un archivo con nombre, un estilo C FILE * es correcto, entonces mire tmpfile() como lo sugiere @Tom.

19

Aquí está un ejemplo completo:

#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 conoce el nombre del archivo que desea crear (y está seguro de que ya no existirá), entonces es obvio que puede simplemente usar open para abrir el archivo .

tmpnam y tmpfile probablemente deberían evitarse ya que pueden sufrir condiciones de carrera - ver man tmpfile(3) para más detalles.

+1

La página man de Linux para mkstemp (3) dice que los últimos 6 caracteres en el nombre del archivo deben ser XXXXXX. Consulte http://www.kernel.org/doc/man-pages/online/pages/man3/mkstemp.3.html – jfs

+0

Hmm, la página de manual de OS X para mkstemp dice que puede tener un número variable de XXX. Sin embargo, en aras de la claridad (y dado que la mayoría de la gente probablemente esté usando Linux) he cambiado el ejemplo anterior. – DaveR

+0

En realidad, es mktemp y tmpnam que sufren las condiciones de carrera que mencionas, no el tmpfile. tmpfile devuelve el manejador de un archivo C, por lo que no obtendrá una secuencia C++, pero tampoco obtendrá una condición de carrera. Creo que las páginas man a las que desea hacer referencia son para tmpname (3) http://www.kernel.org/doc/man-pages/online/pages/man3/tmpnam.3.html y mktemp http: // www .kernel.org/doc/man-pages/online/pages/man3/mktemp.3.html –

0

Bueno, suponiendo que haya tenido éxito en la creación del archivo temporal, puede usar la función eliminar para eliminarlo.

La función se declara en stdio.h -

#include <stdio.h> 

int remove(const char *pathname); 

Por ejemplo, si desea eliminar un archivo llamado miarchivo.txt el código será

#include<stdio.h> 

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

Espero que ahora, ya sabes cómo crear el archivo temporal, por lo que esto debería resolver tu consulta. Espero que ayude.

1

Me pregunto por qué la mayoría de ustedes le enseñaron la forma C de hacerlo en lugar de C++.
Aquí está fstream.
Pruebe eso, eliminar un archivo depende del sistema operativo pero puede usar boost.filesystem para facilitarle las cosas.

+2

Probablemente se deba a que OP solicitó un archivo temporal y no existen mecanismos estándar de C++ para crear un nombre de archivo único. No hay nada en libstdC++ o boost que reemplace realmente a mkstemp(). – Tom

5

Esto puede ser un poco fuera de tema porque el autor quería crear un tmp.txt y eliminarlo después de usarlo, pero eso es trivial - puede abrirlo() y eliminarlo (usando boost :: filesystem por supuesto).

mkstemp() es basado en UNIX. Con Windows usa GetTempFileName() y GetTempPath() para generar una ruta a un archivo temporal. El código de ejemplo de MSDN:

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

3

En Linux (comenzando con el núcleo 3.11), hay bandera para abrir (2) O_TMPFILE que crea un archivo temporal que no tiene un nombre (es decir, que no muestra arriba en el sistema de archivos). Esto tiene algunas características interesantes:

  • No se preocupe por nombres únicos, es solo un inodo, no hay nombre.
  • No hay condiciones de carrera durante la creación (por ejemplo, ataques de enlace simbólico).
  • No hay archivos extraviados si su aplicación falla, siempre se elimina automáticamente.
Cuestiones relacionadas