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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
#1

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

18.04.2011, 22:58. Просмотров 1746. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2011, 22:58     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно?
Посмотрите здесь:
Не создаётся объект string на ровном месте! Почему? C++
C++ Почему два раза создаётся объект с ОДНИМ И ТЕМ ЖЕ ИМЕНЕМ?
C++ Почему при инициализации строки, сначала создаётся пустой объект?
Не создаётся exe файл C++
Не создаётся объектный файл C++
почему глобальную переменную не видно, хотя она объяылена? C++
в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
18.04.2011, 23:40     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно? #2
Создал. В корне C.
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
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...TMPNAM.3.shtml
Ну то есть первый параметр- имя текущей директории.

Ошибки нет, файл где-то создаётся, но где- не могу понять
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.04.2011, 07:44     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно? #4
Посмотри снова в корне.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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 же по сути просто-напросто генерит строку символов, не совпадающую ни с одним из названием файлов, которые есть в текущем каталоге.
неправильно
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
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 минуты
То есть последнее предложение надо читать так:
"И если они сравниваются с именами файлов в текущем каталоге ДИСКА"
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
19.04.2011, 11:03     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно? #7
Цитата Сообщение от kravam
...Так что всё верно.
нет, там нигде нет про текущий каталог
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.04.2011, 11:04     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно? #8
Странная какая то тем, ТС сам постит решения, потом их екритикует, а задачу не говорит.
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
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 создать имя файла уникальное в текущем каталоге.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.04.2011, 12:03     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно? #10
Цитата Сообщение от kravam Посмотреть сообщение
Тем самым я говорю: я пытался делать то-то и то-то но это мне нпе подходит по тем-о и тем-то причинам.
Пока я вижу: "Я пытался сделать, у меня не получается". А что не получилось, постеепенно становится не понятно. Показать свой код надо и не только для демонтрации. Фокус ещзё вот в чём: если у тебя что то не получилось, то не видя твоего кода подсказать что либо нему проблематично и отвечающим остаётся сочинять всё самим, а тебе потом фиг знает как разбираться в коде, не похожем не толко на твой, но и между собой, + не факт, что захотят с этим возится. А так надо только дополнить то, что уже есть. А в како направлении дополнять ты сказал? Я, например, что то вообще не понял, о какоком сравнении имён файлов идёт речь и для чего оно нужно.

Добавлено через 4 минуты
И что требуется от функции tmpnam, то же не понятно.
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
19.04.2011, 12:04  [ТС]     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно? #11
Коль скоро tmpnam создаёт файл с уникальным именем, хотелось бы знать, в пределах какого каталога это имя уникально. Из официальной документации, представленной здесь, я этот вопрос не понял. Всё!

...А, не всё. Ещё хотелось бы увидеть пример кода, где tmpname принимает 2 аргумента (если такой код возможен в принципе). Ну всё, если я и щас непонятен, наверное, надо меня списывать в тираж.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
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 секунды
При этом ответа по самому коду не было.
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
19.04.2011, 12:12  [ТС]     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно? #13
Блин ну если я так же непонятен как и ты, то прошу прощения. Ну вот я продублирую свой пост:
Коль скоро tmpnam создаёт файл с уникальным именем, хотелось бы знать, в пределах какого каталога это имя уникально. Из официальной документации, представленной здесь, я этот вопрос не понял. Всё!

...А, не всё. Ещё хотелось бы увидеть пример кода, где tmpname принимает 2 аргумента (если такой код возможен в принципе). Ну всё, если я и щас непонятен, наверное, надо меня списывать в тираж.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2011, 12:56     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно?
Еще ссылки по теме:
О том, почему нелюбим goto; как его правильно использовать; и чем в моем случае его можно заменить? C++
C++ Файл: При сохранение в файл big100.txt в блокноте отображаются иероглифы, почему?
Где должен находиться файл, чтоб программа его открыла, или как указывать его имя? C++
C++ Дан текстовый файл. Перепишите его в выходной файл, удалив все знаки препинания
C++ Дан исходный текстовый файл. Записать его строки в выходной файл в перевёрнутом виде

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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
19.04.2011, 12:56     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно? #15
Посмотрите функцию tempnam.
Yandex
Объявления
19.04.2011, 12:56     Почему БЕЗОШИБОЧНО создаётся файл, а его не видно?
Ответ Создать тему
Опции темы

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