Как создать временный текстовый файл на С++?
Я пытаюсь создать временный текстовый файл на С++ и затем удалить его в конце
программы. Мне не повезло с Google.
Не могли бы вы сказать, какие функции использовать?
Ниже приведены ответы на вопрос о том, как создать временный файл. Что, если я просто хочу
создать файл (tmp.txt), а затем удалить его? Как мне это сделать?
Ответы
Ответ 1
Возможно, это поможет
FILE * tmpfile ( void );
http://www.cplusplus.com/reference/clibrary/cstdio/tmpfile/
Открыть временный файл
Создает временный двоичный файл, открывается для обновления (режим wb + - см. fopen for Детали). Имя файла гарантировано быть отличным от любого другого существующий файл. Временный файл автоматически создается, когда поток закрывается (fclose) или когда программа обычно заканчивается.
См. также
char * tmpnam ( char * str );
Создание временного имени файла
Строка, содержащая имя файла отличается от любого существующего файла генерироваться. Эта строка может использоваться для создать временный файл без перезапись любого другого существующего файла.
http://www.cplusplus.com/reference/clibrary/cstdio/tmpnam/
Ответ 2
Вот полный пример:
#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)
.
Ответ 3
Это может быть немного не по теме, потому что автор хотел создать tmp.txt и удалить его после его использования, но это тривиально: вы можете просто открыть() его и удалить его (используя boost:: filesystem Конечно).
mkstemp() является основанной на UNIX. В Windows вы используете GetTempFileName() и GetTempPath() для генерации пути к временному файлу. Пример кода из MSDN:
http://msdn.microsoft.com/en-us/library/aa363875%28VS.85%29.aspx
Ответ 4
В Linux (начиная с ядра 3.11) существует флаг для открытия (2) O_TMPFILE, который создает временный файл, который не имеет имени (т.е. он не отображается в файловой системе). Это имеет несколько интересных особенностей:
- Не стоит беспокоиться об уникальных именах, это просто индекс, нет имени.
- Отсутствие условий гонки во время создания (например, атаки symlink).
- Никаких бродячих файлов, если ваше приложение выходит из строя, оно всегда автоматически удаляется.
Ответ 5
Если вам нужен именованный файл (например, вы можете передать имя другому процессу, возможно, компилятору или редактору), затем зарегистрируйте функцию очистки, которая удаляет файл с помощью atexit()
. Для создания файла можно использовать либо С++ <iostream>
, либо C FILE *
(<cstdio>
). Не полностью стандартная, но широко доступная функция mkstemp()
создает файл и сообщает его имя, а также возвращает дескриптор файла (третий механизм ввода-вывода); вы можете использовать функцию fdopen()
для преобразования дескриптора файла в FILE *
.
Если вам не нужен именованный файл, C-style FILE *
в порядке, то посмотрите tmpfile()
, как это было предложено @Tom.
Ответ 6
Интересно, почему большинство из вас, ребята, показали ему способ C сделать это вместо С++.
Здесь fstream.
Попробуйте, чтобы удаление файла зависело от ОС, но вы можете использовать boost.filesystem, чтобы облегчить вам задачу.
Ответ 7
Хорошо, если вам удастся создать временный файл, вы можете использовать функцию remove для его удаления.
Функция объявлена в 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);
}
Надеюсь, вы уже знаете, как создать временный файл, поэтому это должно решить ваш запрос.
Надеюсь, что это поможет.