Как создать временный текстовый файл в C ++?

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

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

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

 Meir20 июн. 2009 г., 22:39
Да. Временный файл будет содержать только временные данные. Вывод будет записан в существующий файл output.txt.
 g06lin20 июн. 2009 г., 22:37
 Tom20 июн. 2009 г., 22:36
а затем удалить его в конце файла?

Ответы на вопрос(7)

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

Если вам не нужен именованный файл в стиле CFILE * хорошо, тогда посмотри наtmpfile() как предложено @Tom.

Решение Вопроса

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

FILE * tmpfile ( void );

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

Open a temporary file

Creates a temporary binary file, open for update (wb+ mode -- see fopen for details). The filename is guaranteed to be different from any other existing file. The temporary file created is automatically deleted when the stream is closed (fclose) or when the program terminates normally.

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

char * tmpnam ( char * str );

Generate temporary filename

A string containing a filename different from any existing file is generated. This string can be used to create a temporary file without overwriting any other existing file.

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

 21 июн. 2009 г., 01:06
Стоит отметить, что могут быть проблемы с tmpfile () и tmpnam () в некоторых контекстах, например,codeproject.com/KB/web-security/TemporaryFileSecurity.aspx
 Meir20 июн. 2009 г., 22:47
Выглядит отлично. Благодарю. Я пробую это ...
 16 апр. 2015 г., 16:28
очень важно отметить, что tmpnam () не должен использоваться. на его странице руководства написано: «Никогда не используйте эту функцию. Вместо этого используйте mkstemp (3) или tmpfile (3). & Quot;
 21 июн. 2009 г., 02:44
@rlbond: Действительно, именно поэтому я включил tmpnam.
 21 июн. 2009 г., 02:43
Конечно, у Tmpfile есть проблема с возвратом дескриптора файла C, а не потока c ++.

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

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

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

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

Функция объявлена в 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);
}

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

#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) для деталей.

 21 июн. 2009 г., 01:52
Справочная страница Linux для mkstemp (3) говорит, что последние 6 символов в имени файла должны быть XXXXXX. Увидетьkernel.org/doc/man-pages/online/pages/man3/mkstemp.3.html
 21 июн. 2009 г., 12:27
Хм, на странице OS X для mkstemp сказано, что у вас может быть переменное число XXX. однако в интересах ясности (и, поскольку большинство людей, вероятно, используют Linux), я изменил приведенный выше пример.
 19 мая 2011 г., 14:36
Фактически, mktemp и tmpnam страдают от условий гонки, о которых вы упоминаете, а не от tmpfile. tmpfile возвращает дескриптор файла C, поэтому вы не получите поток C ++, но вы также не получите условия гонки. Я думаю, что страницы руководства, на которые вы хотите сослаться выше, предназначены для tmpname (3)kernel.org/doc/man-pages/online/pages/man3/tmpnam.3.html и mktempkernel.org/doc/man-pages/online/pages/man3/mktemp.3.html

который создает временный файл, который не имеет имени (то есть он не отображается в файловой системе). Это имеет несколько интересных особенностей:

No worries about unique names, it's just an inode, there is no name. No race co,nditions during creation (e.g. symlink attacks). No stray files if your app crashes, it's always automatically deleted.

почему большинство из вас, ребята, показали ему, как это делает С, а не С ++.
Здесь & APOS; sfstream.
Попробуйте, удаление файла зависит от ОС, но вы можете использоватьBoost.Filesystem чтобы вам было проще.

 21 июн. 2009 г., 00:34
Вероятно, это связано с тем, что OP запросил временный файл, и нет стандартных механизмов C ++ для создания уникального имени файла. В libstdc ++ или boost нет ничего, что действительно заменяет mkstemp ().

Ваш ответ на вопрос