2009-06-20 3 views
20

Я пытаюсь создать временный текстовый файл на C++, а затем удалить его в конце программы. Мне не повезло с Google.Как создать временный текстовый файл на C++?

Не могли бы вы сказать, какие функции использовать?


Ниже приведены ответы на вопрос, как создать временный файл. Что делать, если я просто хочу, чтобы создать файл (tmp.txt), а затем удалить его? Как мне это сделать?

+0

, а затем удалить его в конце файла? – Tom

+0

Да. Временный файл будет содержать только временные данные. Выход будет записан в существующий файл output.txt. – Meir

+0

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

ответ

21

Может быть, это поможет

FILE * tmpfile (void); 

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

Открыть временный файл

Создает временный двоичный файл, открытый для обновления (ББ + режим - см Еорепа для деталей). Имя файла гарантируется , чтобы быть отличным от любого другого существующего файла. Созданный временный файл автоматически удаляется, когда поток закрыт (fclose) или когда программа завершается нормально.

Смотрите также

char * tmpnam (char * str); 

Генерация временного файла

Строка, содержащая имя файла отличается от любого существующего файла является генерируется. Эта строка может использоваться для создать временный файл без , перезаписывающий любой другой существующий файл.

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

+0

Выглядит отлично. Благодарю. Я пытаюсь это сделать ... – Meir

+4

Стоит отметить, что могут возникнуть проблемы с tmpfile() и tmpnam() в некоторых контекстах, например http://www.codeproject.com/KB/web-security/TemporaryFileSecurity. aspx – jfs

+2

Tmpfile, конечно, имеет проблему возврата дескриптора файла C, а не потока C++. – rlbond

2

Если вам нужен указанный файл (например, так что вы можете передать имя другому процессу, возможно, компилятор или редактор), а затем зарегистрировать функцию очистки, которая удаляет файл с atexit(). Для создания файла можно использовать либо C++ <iostream>, либо C FILE * (<cstdio>). Не полностью стандартная, но широко доступная функция mkstemp() создает файл и сообщает его имя, а также возвращает дескриптор файла (третий механизм ввода-вывода); вы можете использовать функцию fdopen() для преобразования дескриптора файла в FILE *.

Если вам не нужен именованный файл, C-стиль FILE * в порядке, то посмотрите на tmpfile(), как предложено @Tom.

19

Вот полный пример:

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

Если вы знаете имя файла, который вы хотите создать (и уверены, что это не будет уже существовать), то вы можете, очевидно, просто использовать open, чтобы открыть файл ,

tmpnam и tmpfile следует избегать, так как они могут пострадать от условий гонки - см. man tmpfile(3) для деталей.

+1

На странице руководства Linux для mkstemp (3) указано, что последние 6 символов в имени файла должны быть XXXXXX. См. Http://www.kernel.org/doc/man-pages/online/pages/man3/mkstemp.3.html – jfs

+0

Хм, справочная страница OS X для mkstemp говорит, что вы можете иметь переменное число XXX. однако в интересах ясности (и, поскольку большинство людей, вероятно, используют Linux), я изменил приведенный выше пример. – DaveR

+0

На самом деле это mktemp и tmpnam, которые страдают от условий гонки, о которых вы упоминаете, а не tmpfile. tmpfile возвращает дескриптор файла C, поэтому вы не получите поток C++, но вы также не получите условие гонки. Я думаю, что страницы руководства, которые вы хотите ссылаться выше, предназначены для tmpname (3) http://www.kernel.org/doc/man-pages/online/pages/man3/tmpnam.3.html и mktemp http: // www .kernel.org/doc/man-pages/online/pages/man3/mktemp.3.html –

0

Ну, предполагая, что вам удалось создать временный файл, вы можете использовать функцию удаления, чтобы удалить его.

Функция объявлена ​​в stdio.h -

#include <stdio.h> 

int remove(const char *pathname); 

Например, если вы хотите удалить файл с именем myfile.txt код будет

#include<stdio.h> 

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

Я надеюсь, что теперь, вы уже знаете, как создать временный файл, поэтому это должно решить ваш запрос. Надеюсь, это поможет.

1

Интересно, почему большинство из вас, ребята, показали ему способ C сделать это вместо пути C++.
Адрес fstream.
Попробуйте, чтобы удаление файла зависело от ОС, но вы можете использовать boost.filesystem, чтобы все было легко для вас.

+2

Это, вероятно, потому, что OP запросил временный файл, и нет стандартных механизмов C++ для создания уникального имени файла. В libstdC++ ничего не происходит или повышается, что действительно заменяет mkstemp(). – Tom

5

Это может быть немного не по теме, поскольку автор хотел создать tmp.txt и удалить его после его использования, но это тривиально - вы можете просто открыть() его и удалить его (используя boost :: filesystem конечно).

mkstemp() является UNIX-based. В Windows вы используете GetTempFileName() и GetTempPath() для генерации пути к временному файлу. Пример кода из MSDN:

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

3

В Linux (начиная с ядра 3.11), есть флаг, чтобы открыть (2) O_TMPFILE, что создает временный файл, который не имеет имени (т.е. он не показывает в файловой системе). Это имеет несколько интересных особенностей:

  • Не беспокойтесь об уникальных именах, это просто индекс, нет имени.
  • Отсутствие условий гонки во время создания (например, атаки символической ссылки).
  • Никаких бродячих файлов, если ваше приложение выходит из строя, оно всегда автоматически удаляется.
Смежные вопросы