Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,302
18.04.2011, 22:58     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно? #1
Друзья! Вот простой код, создаётся файл, а имя для него генерит функция
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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2011, 22:58     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно?
Посмотрите здесь:

почему глобальную переменную не видно, хотя она объяылена? C++
C++ Почему два раза создаётся объект с ОДНИМ И ТЕМ ЖЕ ИМЕНЕМ?
в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! C++
Не создаётся объект string на ровном месте! Почему? C++
C++ Файл: При сохранение в файл big100.txt в блокноте отображаются иероглифы, почему?
C++ Дан текстовый файл. Перепишите его в выходной файл, удалив все знаки препинания
Не создаётся объектный файл C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9384 / 5434 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
19.04.2011, 17:34     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно? #21
Цитата Сообщение от kravam Посмотреть сообщение
Ну хоть бы сделали tempnam дабы можно было САМОМУ указывать директорию!
В каком смысле "хоть бы сделали"? В том же мелкомягком stdio.h:
Код
_CRT_NONSTDC_DEPRECATE(_tempnam) _CRTIMP char * __cdecl tempnam(__in_z_opt const
 char * _Directory, __in_z_opt const char * _FilePrefix);
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,302
19.04.2011, 17:58  [ТС]     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно? #22
fasked,
easybudda,
А мне казалось, я убедил вас, что написать можно всё, что угодно.. Можно написать что рабочей директория считается текущая, а рабочей будет корневой каталог диска... Ну что ж ещё раз, из MSND


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
 
int main( void )
{   
  
   // 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);
     
}
Что всё это значит?
Создаёт временное имя файла во временной же директории... ТО есть я ЯВНО указываю директорию,
а при создании имени файла берётся за основу ЛЕВАЯ директория, я в неё в жизни не лазил
и щас не хочу, я хочу работать в ТЕКУЩЕЙ, а они мне подсовывают непонятно что.
C:\DOCUME~1\user\LOCALS~1\Temp\2\stq2 is safe to use as a temporary file.

...Нет, ну смешно же. Мы проверяем на наличие имён файлы директории X (в данном случае c:\\tmp
), а создаём такой файл для диретории Y
Вот и проверяли бы Y на наличие таких файлов.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
19.04.2011, 18:32     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно? #23
Цитата Сообщение от kravam Посмотреть сообщение
Создаёт временное имя файла во временной же директории... ТО есть я ЯВНО указываю директорию,
а при создании имени файла берётся за основу ЛЕВАЯ директория, я в неё в жизни не лазил
Я могу Вас понять, но читать лучше само описание, а не комментарии к коду (это еще раз доказывает, что излишние комментарии зло). На этой же самой странице описаны параметры функций:
Parameters

prefix
The string that will be pre-pended to names returned by _tempnam.

dir
The path used in the file name if there is no TMP environment variable, or if TMP is not a valid directory.

str
Pointer that will hold the generated name and will be identical to the name returned by the function. This is a convenient way to save the generated name.
dir - Путь используется в имени файла, если не существует переменной среды окружения TMP или если TMP не валидная директория.
С этим понятно? То есть, Вы можете стереть все переменные среды окружения и радоваться
Ниже (в этой же статье написано еще раз):
_tempnam will generate a unique file name for a directory chosen by the following rules:

If the TMP environment variable is defined and set to a valid directory name, unique file names will be generated for the directory specified by TMP.

If the TMP environment variable is not defined or if it is set to the name of a directory that does not exist, _tempnam will use the dir parameter as the path for which it will generate unique names.

If the TMP environment variable is not defined or if it is set to the name of a directory that does not exist, and if dir is either NULL or set to the name of a directory that does not exist, _tempnam will use the current working directory to generate unique names. Currently, if both TMP and dir specify names of directories that do not exist, the _tempnam function call will fail.
_tempnam будет генерировать уникальное имя файла в директории выбранной согласно следующим правилам:
Если переменная среды окружения TMP определена и установлена как валидный путь к директории, то уникальные имена файлов будут сгенерированы для директории определенной в TMP.
Если TMP не определена или установлена как имя несуществующей директории, _tempnam будет использовать параметр dir как путь для которого будут сгенерированы уникальные имена.
Если TMP не определена или установлена как имя несуществующей директории и если параметр dir равен NULL или имени директории, которой не существует, то _tempnam будет исопльзовать текущую рабочую директорию для генерации уникальных имен. В настоящее время, если и TMP и dir указывают на директории, которых не существует, вызов _tempnam завершится с ошибкой.

В общем все сложно с этой функцией у мелкомягких, как и со всеми остальными POSIX функциями.
Однако, я все равно не могу понять причины. Для чего создавать файл в директории с программой, если он все равно временный?
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,302
19.04.2011, 18:44  [ТС]     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно? #24
Ну всё ясно, короче. Всё плохо.
...Файл-то не временный в то-то и дело. Он может быть и постоянным. Просто используется такая функция, а так-то его можно и не удалять; а сам он точно не удалится.

Практическое применение этой функции- меньше заморочек с именами. Тем более, можно ведь давать имена файлам более или менее осмысленные, если использовать префикс.
Но это, кажись, уже в мечтах.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9384 / 5434 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
19.04.2011, 19:36     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно? #25
Ну зачем такое нужно - можно представить. Другое дело - беда со стандартными функциями, да и тьфу на них. Придумать алгоритм генерёжки имён файлов из текущего времени и буковок на хвосте, если их (файлов) больше штуки в секунду генерится - в принципе не задача...
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.04.2011, 01:52     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно? #26
msdn
Each of these functions returns the name of a file that does not currently exist. tmpnam returns a name unique in the current working directory
это не стандарт, а описание компилятора MSVC

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

написав код, который создаёт имя файла, полагая, что тот в текущей директории, может возникнуть ошибка на каком-нибудь другом компиляторе
(я приводил пример, где программа в каталоге $HOME/tmp/tests создаёт файлы в /tmp)

Цитата Сообщение от fasked
Посмотрите функцию tempnam.
она нестандарная

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

присоединяю инфу из C99. draft
там также говорится о нулевом указателе, который может вернуть функция
Миниатюры
Почему БЕЗОШИБОЧНО создаётся файл, а его не видно?  
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,302
20.04.2011, 12:23  [ТС]     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно? #27
Цитата Сообщение от accept Посмотреть сообщение
она ищет в каком-то месте, которое может варьироваться от компилятора к компилятору
Так может быть надо в настройках компилятора порыться?
Файл stdio.h


C++
1
2
3
4
5
6
7
8
9
10
11
/*
 * Tmpnam, tmpfile and, sometimes, _tempnam try to create
 * temp files in the root directory of the current drive
 * (not in pwd, as suggested by some older MS doc's).
 * Redefining these macros does not effect the CRT functions.
 */
#define _P_tmpdir   "\\"
#ifndef __STRICT_ANSI__
#define P_tmpdir _P_tmpdir
#endif
#define _wP_tmpdir  L"\\"
Вот это не смог перевести
"Redefining these macros does not effect the CRT functions."
Что такое CRT, знает кто-нибудь?

...Хотя
C++
1
#define _P_tmpdir   ".\\"
всё равно ничего не дало...
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.04.2011, 03:19     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно? #28
Цитата Сообщение от kravam
Так может быть надо в настройках компилятора порыться?
нет, надо написать программу, которая годится для любых компиляторов
и это вполне реально

1. сгенерировать случайную последовательность символов
2. найти в каталоге все файлы
3. сравнить последовательность с именем каждого файла
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,302
21.04.2011, 09:37  [ТС]     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно? #29
Я хочу быть последовательным, раз уж встал вопрос о работоспособности моего, да и не только моего компилятора, надо его выяснить тык скыть до конца. А если щас я буду реализовывать tmpnam, то я её, конечно, реализую, но вопрос о компиляторе отложится в долгий ящик таким образом. А потом вообще зарастёт мхом. Нельзя этого допускать!

...Тем более, что считайте, что tmpnam реализована уже, тут трудностей нет никаких!
Начать с этой строки:
C++
1
Redefining these macros does not effect the CRT functions
Ребята, знает ли кто-нибудь её смысл?
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
21.04.2011, 10:41     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно? #30
Цитата Сообщение от kravam Посмотреть сообщение
Ребята, знает ли кто-нибудь её смысл?
Переопределение данного макроса не несет эффекта на функции C Run-Time библиотек.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2011, 10:53     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно?
Еще ссылки по теме:

Где должен находиться файл, чтоб программа его открыла, или как указывать его имя? C++
Дан файл. Надо отсортировать этот файл в порядке убывания длин его строк C++
C++ Почему при инициализации строки, сначала создаётся пустой объект?
О том, почему нелюбим goto; как его правильно использовать; и чем в моем случае его можно заменить? C++
Не создаётся exe файл C++

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,302
21.04.2011, 10:53  [ТС]     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно? #31
Это что, типа бесполезно его менять?
Yandex
Объявления
21.04.2011, 10:53     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно?
Ответ Создать тему
Опции темы

Текущее время: 21:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru