Как создать временный текстовый файл в C ++? - PullRequest
23 голосов
/ 21 июня 2009

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

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


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

Ответы [ 7 ]

22 голосов
/ 21 июня 2009

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

FILE * tmpfile ( void );

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

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

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

Смотри также

char * tmpnam ( char * str );

Создать временное имя файла

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

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

20 голосов
/ 21 июня 2009

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

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

6 голосов
/ 04 марта 2010

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

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

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

3 голосов
/ 07 октября 2014

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

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

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

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

1 голос
/ 21 июня 2009

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

0 голосов
/ 21 июня 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...