2009-06-20 19 views
20

Próbuję utworzyć tymczasowy plik tekstowy w C++, a następnie usunąć go na końcu programu. Nie miałem szczęścia w Google.Jak utworzyć tymczasowy plik tekstowy w C++?

Czy możesz mi powiedzieć, z których funkcji korzystać?


Poniższe odpowiedzi pokazują, jak utworzyć plik tymczasowy. Co jeśli chcę po prostu utworzyć plik (tmp.txt), a następnie go usunąć? Jak to zrobić?

+0

, a następnie usunąć go na końcu pliku? – Tom

+0

Tak. Plik tymczasowy będzie zawierał tylko dane tymczasowe. Dane wyjściowe zostaną zapisane w istniejącym pliku output.txt. – Meir

+0

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

Odpowiedz

21

Może to pomoże

FILE * tmpfile (void); 

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

otworzyć plik tymczasowy

tworzy tymczasowy plik binarny, otwartą dla aktualizacji (WB + tryb - patrz fopen dla szczegóły). Nazwa pliku jest gwarantowana , aby różniła się od jakiegokolwiek innego istniejącego pliku . Utworzony plik tymczasowy zostanie automatycznie usunięty, gdy strumień zostanie zamknięty (fclose) lub gdy program zakończy się normalnie.

Zobacz także

char * tmpnam (char * str); 

Generowanie tymczasowego pliku

Ciąg zawierający nazwę pliku inny od dowolnego istniejącego pliku jest generowane. Ten ciąg może być użyty do utworzenia pliku tymczasowego bez zastąpienia innego istniejącego pliku przez .

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

+0

Wygląda świetnie. Dzięki. Próbuję go ... – Meir

+4

Warto wspomnieć, że mogą występować problemy z tmpfile() i tmpnam() w niektórych kontekstach, np. Http://www.codeproject.com/KB/web-security/TemporaryFileSecurity. aspx – jfs

+2

Tmpfile, oczywiście, ma problem zwrócenia uchwytu pliku C, a nie strumienia C++. – rlbond

2

Jeśli potrzebujesz nazwie pliku (na przykład, można więc podać nazwę do innego procesu, może kompilator lub montaż), a następnie przypisać funkcję czyszczenia, który usuwa plik z atexit(). Możesz użyć C++ <iostream> lub C FILE * (<cstdio>), aby utworzyć plik. Niezupełnie standardowa, ale szeroko dostępna funkcja mkstemp() tworzy plik i podaje jego nazwę, a także zwraca deskryptor pliku (trzeci mechanizm wejścia/wyjścia); można użyć funkcji fdopen() do konwersji deskryptora pliku na FILE *.

Jeśli nie potrzebujesz nazwanego pliku, styl C FILE * jest OK, a następnie spójrz na tmpfile() zgodnie z sugestią @Tom.

19

Oto pełna przykład:

#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. 
} 

Jeśli znasz nazwę pliku, który chcesz utworzyć (i są pewni, że nie będzie już istnieć) a następnie można oczywiście po prostu użyć open otworzyć plik .

tmpnam i tmpfile prawdopodobnie należy unikać, ponieważ mogą ucierpieć z powodu warunków wyścigu - szczegółowe informacje można znaleźć na stronie man tmpfile(3).

+1

Strona podręcznika systemu Linux dla mkstemp (3) mówi, że ostatnie 6 znaków w nazwie pliku musi być XXXXXX. Zobacz http://www.kernel.org/doc/man-pages/online/pages/man3/mkstemp.3.html – jfs

+0

Hmm, strona podręczna OS X dla mkstemp mówi, że możesz mieć zmienną liczbę XXX. jednak w celu zachowania przejrzystości (i "ponieważ większość ludzi prawdopodobnie używa Linuksa) zmieniłem powyższy przykład. – DaveR

+0

W rzeczywistości jest to mktemp i tmpnam, które cierpią z powodu warunków wyścigu, o których wspomniałeś, a nie tmpfile. tmpfile zwraca uchwyt pliku C, więc nie otrzymasz strumienia C++, ale także nie dostaniesz warunku wyścigu. Wydaje mi się, że strony podręcznika, do których chcesz się odwołać, są na tmpname (3) http://www.kernel.org/doc/man-pages/online/pages/man3/tmpnam.3.html i mktemp http: // www .kernel.org/doc/man-pages/online/pages/man3/mktemp.3.html –

0

Zakładając, że udało się utworzyć plik tymczasowy, można użyć funkcji usuwania, aby go usunąć.

Funkcja jest zadeklarowane w stdio.h -

#include <stdio.h> 

int remove(const char *pathname); 

Na przykład, jeśli chcesz usunąć plik o nazwie myfile.txt kodu będzie

#include<stdio.h> 

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

Mam nadzieję, że teraz, wiesz już, jak utworzyć plik tymczasowy, więc powinno to rozwiązać twoje zapytanie. Mam nadzieję, że to pomaga.

1

Zastanawiam się, dlaczego większość z was pokazała mu sposób, w jaki robi to C zamiast C++.
Oto fstream.
Spróbuj, usunięcie pliku zależy od systemu operacyjnego, ale możesz użyć opcji boost.filesystem, aby ułatwić sobie pracę.

+2

Prawdopodobnie dlatego, że OP zażądał pliku tymczasowego i nie ma standardowych mechanizmów C++ do tworzenia unikatowych nazw plików. Nie ma niczego w libstdC++ lub boost, który naprawdę zastępuje mkstemp(). – Tom

5

Może to być trochę nie na temat, ponieważ autor chciał utworzyć plik tmp.txt i usunąć go po użyciu, ale to jest banalne - możesz go łatwo otworzyć() i usunąć (za pomocą systemu boost :: files oczywiście).

mkstemp() jest oparty na systemie UNIX. W systemie Windows można użyć GetTempFileName() i GetTempPath(), aby wygenerować ścieżkę do pliku tymczasowego. przykładowy kod z MSDN:

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

3

W systemie Linux (począwszy od jądra 3.11), nie ma flag do open (2) O_TMPFILE który tworzy plik tymczasowy, który nie ma nazwy (czyli nie pokazuje w systemie plików). Ma to kilka interesujących cech:

  • Bez obawy o unikalne nazwy, to tylko inwokat, nie ma nazwy.
  • Brak warunków wyścigu podczas tworzenia (np. Ataki z użyciem dowiązań symbolicznych).
  • Brak niepotrzebnych plików, jeśli Twoja aplikacja ulega awarii, zawsze jest automatycznie usuwana.
Powiązane problemy