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

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

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

Author24 — интернет-сервис помощи студентам
Друзья! Вот простой код, создаётся файл, а имя для него генерит функция
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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2011, 22:58
Ответы с готовыми решениями:

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

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

Почему не создается файл?
Здравствуйте. Помогите, пожайлуста, с файлами. Вот мой код .model small .stack 300h .data ...

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

30
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
19.04.2011, 17:34 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от kravam Посмотреть сообщение
Ну хоть бы сделали tempnam дабы можно было САМОМУ указывать директорию!
В каком смысле "хоть бы сделали"? В том же мелкомягком stdio.h:
Код
_CRT_NONSTDC_DEPRECATE(_tempnam) _CRTIMP char * __cdecl tempnam(__in_z_opt const
 char * _Directory, __in_z_opt const char * _FilePrefix);
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
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 на наличие таких файлов.
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 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 функциями.
Однако, я все равно не могу понять причины. Для чего создавать файл в директории с программой, если он все равно временный?
1
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
19.04.2011, 18:44  [ТС] 24
Ну всё ясно, короче. Всё плохо.
...Файл-то не временный в то-то и дело. Он может быть и постоянным. Просто используется такая функция, а так-то его можно и не удалять; а сам он точно не удалится.

Практическое применение этой функции- меньше заморочек с именами. Тем более, можно ведь давать имена файлам более или менее осмысленные, если использовать префикс.
Но это, кажись, уже в мечтах.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
19.04.2011, 19:36 25
Ну зачем такое нужно - можно представить. Другое дело - беда со стандартными функциями, да и тьфу на них. Придумать алгоритм генерёжки имён файлов из текущего времени и буковок на хвосте, если их (файлов) больше штуки в секунду генерится - в принципе не задача...
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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
там также говорится о нулевом указателе, который может вернуть функция
Миниатюры
Почему БЕЗОШИБОЧНО создаётся файл, а его не видно?  
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
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   ".\\"
всё равно ничего не дало...
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
21.04.2011, 03:19 28
Цитата Сообщение от kravam
Так может быть надо в настройках компилятора порыться?
нет, надо написать программу, которая годится для любых компиляторов
и это вполне реально

1. сгенерировать случайную последовательность символов
2. найти в каталоге все файлы
3. сравнить последовательность с именем каждого файла
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
21.04.2011, 09:37  [ТС] 29
Я хочу быть последовательным, раз уж встал вопрос о работоспособности моего, да и не только моего компилятора, надо его выяснить тык скыть до конца. А если щас я буду реализовывать tmpnam, то я её, конечно, реализую, но вопрос о компиляторе отложится в долгий ящик таким образом. А потом вообще зарастёт мхом. Нельзя этого допускать!

...Тем более, что считайте, что tmpnam реализована уже, тут трудностей нет никаких!
Начать с этой строки:
C++
1
Redefining these macros does not effect the CRT functions
Ребята, знает ли кто-нибудь её смысл?
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
21.04.2011, 10:41 30
Цитата Сообщение от kravam Посмотреть сообщение
Ребята, знает ли кто-нибудь её смысл?
Переопределение данного макроса не несет эффекта на функции C Run-Time библиотек.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
21.04.2011, 10:53  [ТС] 31
Это что, типа бесполезно его менять?
0
21.04.2011, 10:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.04.2011, 10:53
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru