Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/10: Рейтинг темы: голосов - 10, средняя оценка - 4.80
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,531
1

Почему БЕЗОШИБОЧНО создаётся файл, а его не видно?

18.04.2011, 22:58. Просмотров 1907. Ответов 30
Метки нет (Все метки)

Друзья! Вот простой код, создаётся файл, а имя для него генерит функция
tmpnam; Но файла не видно! Ни после выполнения программы ни в процессе (перед закрытием). никак, все каталоги перерыл. Чё-то я не понимаю, чё за файл такой? И где его можно применить?

Что касается временных файлов, то есть функция tmpfile, она создаёт ВРЕМЕННЫЕ файлы. Что это значит, я не вникаю, но , если файл созданный с помощью tmpfile будет вести себя страно, будет невидимым, я не удивлюсь.

...tmpnam же по сути просто-напросто генерит строку символов, не совпадающую ни с одним из названием файлов, которые есть в текущем каталоге. Всё! И не больше.
Так нет же, tmpnam(tmpstr) возвращает указатель, применяя который как название файла, файл невидим. Чё-то ребята я не пойму, это так задумано создателями?



C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <stdio.h>
using namespace std;
 
int main()
{
  FILE *fp;
  char tmpstr[L_tmpnam];
  // Открываем файл
  fp = fopen(tmpnam(tmpstr), "w");
  if(fp == NULL)
  {
    cout << "Невозможно открыть файл: " << ferror(fp) <<  "\n";
    return 1;
  }
 
  // Закрываем файл
 
  getchar ();
  fclose(fp);
  return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2011, 22:58
Ответы с готовыми решениями:

Не создаётся объект string на ровном месте! Почему?
Ребята, чё-то я не пойму: #include &lt;string&gt; #include &lt;stdio.h&gt; #include...

Почему при инициализации строки, сначала создаётся пустой объект?
Чтобы при создании присвоить строке какое-то значение, можно использовать два...

Почему два раза создаётся объект с ОДНИМ И ТЕМ ЖЕ ИМЕНЕМ?
#include &lt;windows.h&gt; #include &lt;iostream&gt; using namespace std; class arr{ ...

Не создаётся exe файл
Вот код, создаю проекта в визуал студио, компилирую, выдаёт ошибку что не...

Не создаётся объектный файл
Необходимо создать объектный файл вот код: #include &lt;stdio.h&gt; //#include...

30
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
18.04.2011, 23:40 2
Создал. В корне C.
0
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,531
19.04.2011, 00:58  [ТС] 3
Хорошо, а как сделать его в текущей директории? Не буду же я лазить постоянно в диск С!
Вот код сделал такой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <stdio.h>
using namespace std;
 
int main()
{
  FILE *fp;
  fp = fopen(tempnam (".\\", NULL), "w");
  if(fp == NULL)
  {
    cout << "Невозможно открыть файл: " << ferror(fp) <<  "\n";
    return 1;
  }
 
  // Закрываем файл
//  fclose(fp);
  getchar ();
  return 0;
}
А синтаксис функции tmpnam взял отсюда:
http://citforum.ru/operating_systems/manpages/TMPNAM.3.shtml
Ну то есть первый параметр- имя текущей директории.

Ошибки нет, файл где-то создаётся, но где- не могу понять
0
taras atavin
4204 / 1767 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
19.04.2011, 07:44 4
Посмотри снова в корне.
0
accept
4833 / 3255 / 455
Регистрация: 10.12.2008
Сообщений: 10,569
19.04.2011, 07:49 5
C89
L_tmpnam

which expands to an integral constant expression that is the size of
an array of char large enough to hold a temporary file name string
generated by the tmpnam function;
TMP_MAX

which expands to an integral constant expression that is the minimum
number of unique file names that shall be generated by the tmpnam
function;
4.9.4.4 The tmpnam function

Synopsis

#include <stdio.h>
char *tmpnam(char *s);

Description

The tmpnam function generates a string that is a valid file name
and that is not the same as the name of an existing file./102/

The tmpnam function generates a different string each time it is
called, up to TMP_MAX times. If it is called more than TMP_MAX times,
the behavior is implementation-defined.

The implementation shall behave as if no library function calls the
tmpnam function.

Returns

If the argument is a null pointer, the tmpnam function leaves its
result in an internal static object and returns a pointer to that
object. Subsequent calls to the tmpnam function may modify the same
object. If the argument is not a null pointer, it is assumed to point
to an array of at least L_tmpnam char s; the tmpnam function writes
its result in that array and returns the argument as its value.

"Environmental limits"

The value of the macro TMP_MAX shall be at least 25.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <assert.h>
 
#define MAXPATH  1000
 
int main(void)
{
    FILE *fp;
    char path[MAXPATH + L_tmpnam];
        
    printf("L_tmpnam: %d\n", L_tmpnam);
    printf("TMP_MAX: %d\n", TMP_MAX);
    
    sprintf(path, "%s", tmpnam(NULL));
    
    printf("<%s>\n", path);
    
    fp = fopen(path, "w");
    assert(fp != NULL && "open or create file");
    
    putc('.', fp);
    putc('\n', fp);
    
    fclose(fp);
    
    return 0;
}
Код
[guest@localhost tests]$ .ansi t.c -o t
/tmp/ccRTlvM1.o: In function `main':
t.c:(.text+0x3e): warning: the use of `tmpnam' is dangerous, better use `mkstemp'
[guest@localhost tests]$ ./t
L_tmpnam: 20
TMP_MAX: 238328
</tmp/file4d7IoC>
[guest@localhost tests]$ cat /tmp/file4d7IoC
.
[guest@localhost tests]$ ./t
L_tmpnam: 20
TMP_MAX: 238328
</tmp/file7AYVF0>
[guest@localhost tests]$ cat /tmp/file7AYVF0
.
[guest@localhost tests]$ ls /tmp/file*
/tmp/file4d7IoC  /tmp/file6abNZM  /tmp/file7AYVF0  /tmp/file8z4HF5  /tmp/fileJJsp5u
[guest@localhost tests]$
Добавлено через 1 минуту
Цитата Сообщение от kravam
...tmpnam же по сути просто-напросто генерит строку символов, не совпадающую ни с одним из названием файлов, которые есть в текущем каталоге.
неправильно
0
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,531
19.04.2011, 11:03  [ТС] 6
Перевод:

Функция tmpnam генерирует строку которая есть корректное имя файла и которое не такое же, как имя существующего файла (последнее слово почему-то в единственном числе)

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

...Так что всё верно.

+++++++++++++++++++++++++++++++++++++++++++++++++

За науку конечно спасибо, но цель не достигнута, а она такова:

Сделать так, чтобы эта функция создавала файлы в текущем каталоге; и, соответственно, чтобы сравнивала генерируемое имя с именами в ТЕКУЩЕМ же каталоге

Пока же мне неясно из перевода, то ли она ориентируется на файлы только из текущего каталога диска, то ли на файлы со всего (хе-хе) компьютера

В общем, хорошим решением был бы вызов tempnam с двумя аргументами, но он не канает почему-то.

А если использовать проедложенную реализацию tempnam, то сие направильно, т. к. можно будет накропать нечто вроде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <windows.h>
#include <stdio.h>
 
 
#define MAXPATH  1000
 
int main(void)
{
    FILE *fp;
    char ima [MAXPATH];
    GetCurrentDirectory(MAXPATH,ima);
    strcat (ima, tmpnam(NULL));
    fp = fopen(ima, "w");
    fclose(fp);
    getchar ();
    return 0;
}
Вот теперь файлы создаются в текущем каталоге. Но вопрос: а с чем сравниваются имена создаваемых файлов? И если они сравниваются с именами файлов в текущем каталоге, то это плохо и мне не подходит

Добавлено через 3 минуты
То есть последнее предложение надо читать так:
"И если они сравниваются с именами файлов в текущем каталоге ДИСКА"
0
accept
4833 / 3255 / 455
Регистрация: 10.12.2008
Сообщений: 10,569
19.04.2011, 11:03 7
Цитата Сообщение от kravam
...Так что всё верно.
нет, там нигде нет про текущий каталог
0
taras atavin
4204 / 1767 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
19.04.2011, 11:04 8
Странная какая то тем, ТС сам постит решения, потом их екритикует, а задачу не говорит.
0
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,531
19.04.2011, 11:15  [ТС] 9
Цитата Сообщение от taras atavin Посмотреть сообщение
Странная какая то тем, ТС сам постит решения, потом их екритикует, а задачу не говорит.
Просто вот здесь:
http://www.cyberforum.ru/announcement.php?a=3

в частности здесь:
http://www.cyberforum.ru/about-forum/announcement8.html

меня научили задавать вопросы. Тем самым я говорю: я пытался делать то-то и то-то но это мне нпе подходит по тем-о и тем-то причинам.
...Впрочем, понятно, что со здешними темами от подобного отвыкли.

Цитата Сообщение от accept Посмотреть сообщение
нет, там нигде нет про текущий каталог
Я вот английского не знаю, первожу еле-еле, а вы знаете. Так скажите ОПРЕДЕЛЁННО, что там говорится? Она что, на всём компе ищет имена файлов, дабы было с чем сравнивать, или как?

Добавлено через 1 минуту
А задача очень проста: вопрос стоит так: можно ли с помощью функции tmpman создать имя файла уникальное в текущем каталоге.
0
taras atavin
4204 / 1767 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
19.04.2011, 12:03 10
Цитата Сообщение от kravam Посмотреть сообщение
Тем самым я говорю: я пытался делать то-то и то-то но это мне нпе подходит по тем-о и тем-то причинам.
Пока я вижу: "Я пытался сделать, у меня не получается". А что не получилось, постеепенно становится не понятно. Показать свой код надо и не только для демонтрации. Фокус ещзё вот в чём: если у тебя что то не получилось, то не видя твоего кода подсказать что либо нему проблематично и отвечающим остаётся сочинять всё самим, а тебе потом фиг знает как разбираться в коде, не похожем не толко на твой, но и между собой, + не факт, что захотят с этим возится. А так надо только дополнить то, что уже есть. А в како направлении дополнять ты сказал? Я, например, что то вообще не понял, о какоком сравнении имён файлов идёт речь и для чего оно нужно.

Добавлено через 4 минуты
И что требуется от функции tmpnam, то же не понятно.
0
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,531
19.04.2011, 12:04  [ТС] 11
Коль скоро tmpnam создаёт файл с уникальным именем, хотелось бы знать, в пределах какого каталога это имя уникально. Из официальной документации, представленной здесь, я этот вопрос не понял. Всё!

...А, не всё. Ещё хотелось бы увидеть пример кода, где tmpname принимает 2 аргумента (если такой код возможен в принципе). Ну всё, если я и щас непонятен, наверное, надо меня списывать в тираж.
0
taras atavin
4204 / 1767 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
19.04.2011, 12:09 12
И больше всего не понятно, где ты берёшь ответы. Первый пост:

Цитата Сообщение от kravam Посмотреть сообщение
Друзья! Вот простой код, создаётся файл, а имя для него генерит функция
tmpnam; Но файла не видно! Ни после выполнения программы ни в процессе (перед закрытием). никак, все каталоги перерыл. Чё-то я не понимаю, чё за файл такой? И где его можно применить?
Что касается временных файлов, то есть функция tmpfile, она создаёт ВРЕМЕННЫЕ файлы. Что это значит, я не вникаю, но , если файл созданный с помощью tmpfile будет вести себя страно, будет невидимым, я не удивлюсь.
...tmpnam же по сути просто-напросто генерит строку символов, не совпадающую ни с одним из названием файлов, которые есть в текущем каталоге. Всё! И не больше.
Так нет же, tmpnam(tmpstr) возвращает указатель, применяя который как название файла, файл невидим. Чё-то ребята я не пойму, это так задумано создателями?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
 FILE *fp;
 char tmpstr[L_tmpnam];
 // Открываем файл
 fp = fopen(tmpnam(tmpstr), "w");
 if(fp == NULL)
 {
 cout << "Невозможно открыть файл: " << ferror(fp) << "\n";
 return 1;
 }
// Закрываем файл
getchar ();
 fclose(fp);
 return 0;
}
Вроде вопрос по своему коду. Второй:
Цитата Сообщение от ForEveR Посмотреть сообщение
Создал. В корне C.
. Сказано только где искать созданный файл. Но третий:

Цитата Сообщение от kravam Посмотреть сообщение
Хорошо, а как сделать его в текущей директории? Не буду же я лазить постоянно в диск С!
Вот код сделал такой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
 FILE *fp;
 fp = fopen(tempnam (".\\", NULL), "w");
 if(fp == NULL)
 {
 cout << "Невозможно открыть файл: " << ferror(fp) << "\n";
 return 1;
 }
// Закрываем файл
// fclose(fp);
 getchar ();
 return 0;
}
А синтаксис функции tmpnam взял отсюда:
http://citforum.ru/operating_systems...TMPNAM.3.shtml
Ну то есть первый параметр- имя текущей директории.
Ошибки нет, файл где-то создаётся, но где- не могу понять
.

Добавлено через 53 секунды
При этом ответа по самому коду не было.
0
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,531
19.04.2011, 12:12  [ТС] 13
Блин ну если я так же непонятен как и ты, то прошу прощения. Ну вот я продублирую свой пост:
Коль скоро tmpnam создаёт файл с уникальным именем, хотелось бы знать, в пределах какого каталога это имя уникально. Из официальной документации, представленной здесь, я этот вопрос не понял. Всё!

...А, не всё. Ещё хотелось бы увидеть пример кода, где tmpname принимает 2 аргумента (если такой код возможен в принципе). Ну всё, если я и щас непонятен, наверное, надо меня списывать в тираж.
0
taras atavin
4204 / 1767 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
19.04.2011, 12:15 14
На сколько я смог понять, надо так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <windows.h>
#include <stdio.h>
 
 
#define MAXPATH  1000
 
int main(void)
{
    FILE *fp;
    char ima [MAXPATH];
    char *fn;
    GetCurrentDirectory(MAXPATH,ima);
    fn=tmpnam(ima, "tmp");
    strcat(ima,fn);
    fp = fopen(ima, "w");
    fclose(fp);
    getchar ();
    return 0;
}
0
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
19.04.2011, 12:56 15
Посмотрите функцию tempnam.
0
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,531
19.04.2011, 14:45  [ТС] 16
Всё-ж таки, ребята, я чуть-чуть разобрался.

Короче, с tmpnam всё ясно более или менее. Еле-еле в MSND нашёл нужные строки:
"This program uses tmpnam to create a unique filename in the
// current working directory"
То есть tmpnam создаёт имена файла, уникальные в ТЕКУЩЕЙ рабочей директории.
В принципе всё, но если бы кто разъяснил, был бы благодарен на счёт _tempnam

Код взят по ссылке
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// crt_tempnam.c
// compile with: /W3
// This program uses tmpnam to create a unique filename in the
// current working directory, then uses _tempnam to create 
// a unique filename with a prefix of stq. 
 
#include <stdio.h>
#include <stdlib.h>
 
int main( void )
{   
   char* name1 = NULL;
   char* name2 = NULL;
 
   // Create a temporary filename for the current working directory: 
   if( ( name1 = tmpnam( NULL ) ) != NULL ) // C4996
   // Note: tmpnam is deprecated; consider using tmpnam_s instead
      printf( "%s is safe to use as a temporary file.\n", name1 );
   else
      printf( "Cannot create a unique filename\n" );
 
   // Create a temporary filename in temporary directory with the
   // prefix "stq". The actual destination directory may vary
   // depending on the state of the TMP environment variable and
   // the global variable P_tmpdir.   
 
   if( ( name2 = _tempnam( "c:\\tmp", "stq" ) ) != NULL )
      printf( "%s is safe to use as a temporary file.\n", name2 ); 
   else
      printf( "Cannot create a unique filename\n" );
 
   // When name2 is no longer needed :   
   if(name2)
     free(name2);
     
}
Ну тут на самом деле всё понятно, кроме одного, почему
_tempnam

рассматривает директорию c\\temp, а имя файла выдаёт какое-то левое причём результат
этот предсказуемый, вот он там же напечатан:

C:\DOCUME~1\user\LOCALS~1\Temp\2\stq2
А по идее должно быть что-то типа C\tmp\<std_конец_имени_файла>

Добавлено через 1 час 19 минут
Хотя нет, ребята, они написали в MSND ложь. Вот эту ложь:
// This program uses tmpnam to create a unique filename in the
// current working directory

Проведём эксперимент. Накропаем код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <stdio.h>
#include <stdlib.h>
 
int main( void )
{   
   char* name1 = NULL;
   char* name2 = NULL;
 
   // Create a temporary filename for the current working directory: 
   if( ( name1 = tmpnam( NULL ) ) != NULL ) // C4996
   // Note: tmpnam is deprecated; consider using tmpnam_s instead
      printf( "%s is safe to use as a temporary file.\n", name1 );
   else
      printf( "Cannot create a unique filename\n" );
   if( ( name1 = tmpnam( NULL ) ) != NULL ) // C4996
   // Note: tmpnam is deprecated; consider using tmpnam_s instead
      printf( "%s is safe to use as a temporary file.\n", name1 );
   else
      printf( "Cannot create a unique filename\n" );
   if( ( name1 = tmpnam( NULL ) ) != NULL ) // C4996
   // Note: tmpnam is deprecated; consider using tmpnam_s instead
      printf( "%s is safe to use as a temporary file.\n", name1 );
   else
      printf( "Cannot create a unique filename\n" );
   if( ( name1 = tmpnam( NULL ) ) != NULL ) // C4996
   // Note: tmpnam is deprecated; consider using tmpnam_s instead
      printf( "%s is safe to use as a temporary file.\n", name1 );
   else
      printf( "Cannot create a unique filename\n" );
   if( ( name1 = tmpnam( NULL ) ) != NULL ) // C4996
   // Note: tmpnam is deprecated; consider using tmpnam_s instead
      printf( "%s is safe to use as a temporary file.\n", name1 );
   else
      printf( "Cannot create a unique filename\n" );
   if( ( name1 = tmpnam( NULL ) ) != NULL ) // C4996
   // Note: tmpnam is deprecated; consider using tmpnam_s instead
      printf( "%s is safe to use as a temporary file.\n", name1 );
   else
      printf( "Cannot create a unique filename\n" );
   if( ( name1 = tmpnam( NULL ) ) != NULL ) // C4996
   // Note: tmpnam is deprecated; consider using tmpnam_s instead
      printf( "%s is safe to use as a temporary file.\n", name1 );
   else
      printf( "Cannot create a unique filename\n" );
   if( ( name1 = tmpnam( NULL ) ) != NULL ) // C4996
   // Note: tmpnam is deprecated; consider using tmpnam_s instead
      printf( "%s is safe to use as a temporary file.\n", name1 );
   else
      printf( "Cannot create a unique filename\n" );
   if( ( name1 = tmpnam( NULL ) ) != NULL ) // C4996
   // Note: tmpnam is deprecated; consider using tmpnam_s instead
      printf( "%s is safe to use as a temporary file.\n", name1 );
   else
      printf( "Cannot create a unique filename\n" );
   getchar ();
   if( ( name1 = tmpnam( NULL ) ) != NULL ) // C4996
   // Note: tmpnam is deprecated; consider using tmpnam_s instead
      printf( "%s is safe to use as a temporary file.\n", name1 );
   else
      printf( "Cannot create a unique filename\n" );
   if( ( name1 = tmpnam( NULL ) ) != NULL ) // C4996
   // Note: tmpnam is deprecated; consider using tmpnam_s instead
      printf( "%s is safe to use as a temporary file.\n", name1 );
   else
      printf( "Cannot create a unique filename\n" );
   if( ( name1 = tmpnam( NULL ) ) != NULL ) // C4996
   // Note: tmpnam is deprecated; consider using tmpnam_s instead
      printf( "%s is safe to use as a temporary file.\n", name1 );
   else
      printf( "Cannot create a unique filename\n" );
   if( ( name1 = tmpnam( NULL ) ) != NULL ) // C4996
   // Note: tmpnam is deprecated; consider using tmpnam_s instead
      printf( "%s is safe to use as a temporary file.\n", name1 );
   else
      printf( "Cannot create a unique filename\n" );
   if( ( name1 = tmpnam( NULL ) ) != NULL ) // C4996
   // Note: tmpnam is deprecated; consider using tmpnam_s instead
      printf( "%s is safe to use as a temporary file.\n", name1 );
   else
      printf( "Cannot create a unique filename\n" );
   if( ( name1 = tmpnam( NULL ) ) != NULL ) // C4996
   // Note: tmpnam is deprecated; consider using tmpnam_s instead
      printf( "%s is safe to use as a temporary file.\n", name1 );
   else
      printf( "Cannot create a unique filename\n" );
   if( ( name1 = tmpnam( NULL ) ) != NULL ) // C4996
   // Note: tmpnam is deprecated; consider using tmpnam_s instead
      printf( "%s is safe to use as a temporary file.\n", name1 );
   else
      printf( "Cannot create a unique filename\n" );
   if( ( name1 = tmpnam( NULL ) ) != NULL ) // C4996
   // Note: tmpnam is deprecated; consider using tmpnam_s instead
      printf( "%s is safe to use as a temporary file.\n", name1 );
   else
      printf( "Cannot create a unique filename\n" );
   if( ( name1 = tmpnam( NULL ) ) != NULL ) // C4996
   // Note: tmpnam is deprecated; consider using tmpnam_s instead
      printf( "%s is safe to use as a temporary file.\n", name1 );
   else
      printf( "Cannot create a unique filename\n" );
 
 
     
   getchar ();
}
Ну то есть попробуем использовать tmpnam много раз. Запустим код и увидим, к примеру такое:

PureBasic
1
2
3
4
5
6
7
8
9
\s36s. is safe to use as a temporary file.
\s36s.1 is safe to use as a temporary file.
\s36s.2 is safe to use as a temporary file.
\s36s.3 is safe to use as a temporary file.
\s36s.4 is safe to use as a temporary file.
\s36s.5 is safe to use as a temporary file.
\s36s.6 is safe to use as a temporary file.
\s36s.7 is safe to use as a temporary file.
\s36s.8 is safe to use as a temporary file.
OK, теперь залезем в текущюю папку файл и создадим там файл s36s.9 После этого жмём на Enter и видим:
И увидим:

\s36s.9 is safe to use as a temporary file.
...
...
...

Видите? Имя файла s36s.9 сгенерировалось, хотя файл s36s.9 в текущей директории есть!
И вот так много-много раз повторим и всякий раз будет генериться имя ИМЕЮЩЕГОСЯ уже файла

А вот если мы будем создавать файл в директории диска, тогда, всё будет ОК и имя s36s.9 создаваться не будет, а будут создаваться имена:
Bash
1
2
\s36s.a is safe to use as a temporary file.
\s36s.b is safe to use as a temporary file.
Вывод: а безо всяких выводов. От чего начал к тому и пришёл, только в правильности официальных доков усомнился и всё.
0
easybudda
Модератор
Эксперт CЭксперт С++
10107 / 6016 / 1507
Регистрация: 25.07.2009
Сообщений: 11,404
19.04.2011, 16:47 17
man tmpnam
The tmpnam() function returns a pointer to a file name, in the P_tmpdir
directory, which did not reference an existing file at some indeterminate
point in the past. P_tmpdir is defined in the include file <stdio.h>.
If the argument str is non-NULL, the file name is copied to the buffer it
references. Otherwise, the file name is copied to a static buffer. In
either case, tmpnam() returns a pointer to the file name.
При чём, если в никсах всё просто и понятно
Код
$ grep P_tmpdir /usr/include/stdio.h
#define P_tmpdir        "/tmp"
в мелкомягком stdio.h чёрт ногу сломит
Код
#define _P_tmpdir   "/"
#define _wP_tmpdir  L"/"
#define _P_tmpdir   "\\"
#define _wP_tmpdir  L"\\"
/* L_tmpnam = length of string _P_tmpdir
 *            + 1 if _P_tmpdir does not end in "/" or "\", else 0
 * L_tmpnam_s = length of string _P_tmpdir
 *            + 1 if _P_tmpdir does not end in "/" or "\", else 0
#define L_tmpnam   (sizeof(_P_tmpdir) + 12)
#define L_tmpnam_s (sizeof(_P_tmpdir) + 16)
#define P_tmpdir  _P_tmpdir
я так и не понял - это в корне текущего диска, или в папке, из которой программа запущена? Скорее второе, наверное...
0
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
19.04.2011, 17:14 18
Цитата Сообщение от easybudda Посмотреть сообщение
я так и не понял - это в корне текущего диска, или в папке, из которой программа запущена?
Все таки в корне диска, на котором находится программа.
Цитата Сообщение от kravam Посмотреть сообщение
И вот так много-много раз повторим и всякий раз будет генериться имя ИМЕЮЩЕГОСЯ уже файла
Вы в корне пробовали создавать файл с таким же именем? Потому что у меня все в порядке - я создал файл с именем "sbs.2" и при генерации двойка была пропущена, следующий вызов tmpnam выдал сразу "sbs.3". Файл надо создавать не в каталоге с программой, а в корне диска, это важно.
0
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,531
19.04.2011, 17:25  [ТС] 19
Цитата Сообщение от fasked Посмотреть сообщение
Все таки в корне диска, на котором находится программа.

Вы в корне пробовали создавать файл с таким же именем? Потому что у меня все в порядке - я создал файл с именем "sbs.2" и при генерации двойка была пропущена, следующий вызов tmpnam выдал сразу "sbs.3". Файл надо создавать не в каталоге с программой, а в корне диска, это важно.
Да, пробовал,
Цитата Сообщение от kravam Посмотреть сообщение
А вот если мы будем создавать файл в директории диска, тогда, всё будет ОК
всё получается, просто это неудобно, ну ладно захотели разработчики сделать рабочей коревую директорию диска, это их дела. Ну хоть бы сделали tempnam дабы можно было САМОМУ указывать директорию! Нет, она работает, но натурально не разобраться вот так с ходу, она вроде как проверяет указанную директорию и имя создаёт, но имя вообще какое-то левое в какой-то хитрой папке
C:\DOCUME~1\user\LOCALS~1\Temp\...
0
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
19.04.2011, 17:32 20
Цитата Сообщение от kravam Посмотреть сообщение
Ну хоть бы сделали tempnam дабы можно было САМОМУ указывать директорию!
Так а это что такое? _tempnam
0
19.04.2011, 17:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2011, 17:32

Не создаётся файл в Win32 API
Здравствуйте, пишу приложение на Win32 API, есть кнопка при нажатии которой...

почему глобальную переменную не видно, хотя она объяылена?
#include &lt;vector&gt; using namespace std; int min= 1; int main(){ min=...

в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант!
Собсно //Это типа служебного класса. (Внимание! В оригинальном коде он...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru