Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/19: Рейтинг темы: голосов - 19, средняя оценка - 4.53
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698

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

18.04.2011, 22:58. Показов 4142. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.04.2011, 22:58
Ответы с готовыми решениями:

Объект QDialog создается но его не видно
Коротко. При нажатии на кнопку происходить много разных вещей в числе который: .... DialogWindowInputData *AdditionalWindow = new...

Почему не создаётся файл и не производится запись в пустой файл?
Помогите разобраться почему не создаётся файл и не производится запись в пустой файл, в дебагере вроде как всё нормально, указатели и...

Почему не создается файл?
Здравствуйте. Помогите, пожайлуста, с файлами. Вот мой код .model small .stack 300h .data student struc n db 30 dup(' ') ...

30
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
18.04.2011, 23:40
Создал. В корне C.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
19.04.2011, 00:58  [ТС]
Хорошо, а как сделать его в текущей директории? Не буду же я лазить постоянно в диск С!
Вот код сделал такой:
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_s... AM.3.shtml
Ну то есть первый параметр- имя текущей директории.

Ошибки нет, файл где-то создаётся, но где- не могу понять
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.04.2011, 07:44
Посмотри снова в корне.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
19.04.2011, 07:49
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;
}
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[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
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
19.04.2011, 11:03  [ТС]
Перевод:

Функция 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
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
19.04.2011, 11:03
Цитата Сообщение от kravam
...Так что всё верно.
нет, там нигде нет про текущий каталог
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.04.2011, 11:04
Странная какая то тем, ТС сам постит решения, потом их екритикует, а задачу не говорит.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
19.04.2011, 11:15  [ТС]
Цитата Сообщение от taras atavin Посмотреть сообщение
Странная какая то тем, ТС сам постит решения, потом их екритикует, а задачу не говорит.
Просто вот здесь:
https://www.cyberforum.ru/announcement.php?a=3

в частности здесь:
https://www.cyberforum.ru/abou... ment8.html

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

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

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

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

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

Цитата Сообщение от 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_s... AM.3.shtml
Ну то есть первый параметр- имя текущей директории.
Ошибки нет, файл где-то создаётся, но где- не могу понять
.

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

...А, не всё. Ещё хотелось бы увидеть пример кода, где tmpname принимает 2 аргумента (если такой код возможен в принципе). Ну всё, если я и щас непонятен, наверное, надо меня списывать в тираж.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.04.2011, 12:15
На сколько я смог понять, надо так:
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
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
19.04.2011, 12:56
Посмотрите функцию tempnam.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
19.04.2011, 14:45  [ТС]
Всё-ж таки, ребята, я чуть-чуть разобрался.

Короче, с 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
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
19.04.2011, 16:47
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.
При чём, если в никсах всё просто и понятно
Code
1
2
$ grep P_tmpdir /usr/include/stdio.h
#define P_tmpdir        "/tmp"
в мелкомягком stdio.h чёрт ногу сломит
Code
1
2
3
4
5
6
7
8
9
10
11
#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
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
19.04.2011, 17:14
Цитата Сообщение от easybudda Посмотреть сообщение
я так и не понял - это в корне текущего диска, или в папке, из которой программа запущена?
Все таки в корне диска, на котором находится программа.
Цитата Сообщение от kravam Посмотреть сообщение
И вот так много-много раз повторим и всякий раз будет генериться имя ИМЕЮЩЕГОСЯ уже файла
Вы в корне пробовали создавать файл с таким же именем? Потому что у меня все в порядке - я создал файл с именем "sbs.2" и при генерации двойка была пропущена, следующий вызов tmpnam выдал сразу "sbs.3". Файл надо создавать не в каталоге с программой, а в корне диска, это важно.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
19.04.2011, 17:25  [ТС]
Цитата Сообщение от fasked Посмотреть сообщение
Все таки в корне диска, на котором находится программа.

Вы в корне пробовали создавать файл с таким же именем? Потому что у меня все в порядке - я создал файл с именем "sbs.2" и при генерации двойка была пропущена, следующий вызов tmpnam выдал сразу "sbs.3". Файл надо создавать не в каталоге с программой, а в корне диска, это важно.
Да, пробовал,
Цитата Сообщение от kravam Посмотреть сообщение
А вот если мы будем создавать файл в директории диска, тогда, всё будет ОК
всё получается, просто это неудобно, ну ладно захотели разработчики сделать рабочей коревую директорию диска, это их дела. Ну хоть бы сделали tempnam дабы можно было САМОМУ указывать директорию! Нет, она работает, но натурально не разобраться вот так с ходу, она вроде как проверяет указанную директорию и имя создаёт, но имя вообще какое-то левое в какой-то хитрой папке
C:\DOCUME~1\user\LOCALS~1\Temp\...
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
19.04.2011, 17:32
Цитата Сообщение от kravam Посмотреть сообщение
Ну хоть бы сделали tempnam дабы можно было САМОМУ указывать директорию!
Так а это что такое? _tempnam
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.04.2011, 17:32
Помогаю со студенческими работами здесь

Почему не создается файл?
public class CustomOutputStream extends OutputStream { private JTextArea textArea; FileWriter ps; public...

Почему не создается xml-файл?
Доброго времени суток! Есть метод который вызывается при нажатии некой клавишы: форма 1 public void Save() { ...

На вижу мой сайт на своем компе, на других компах его видно. Почему?
Прошу прощения, если не в том разделе, прошу перенести по адресу. Суть проблемы. Я создала сайт и выложила на хостинг. Мой сайт виден с...

Почему не создается файл и не записываются в него элементы?
Почему не создается файл и не записываются в него элементы Form1.cs using System; using System.Collections.Generic; using...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru