Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

18.04.2011, 22:58. Просмотров 1798. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему БЕЗОШИБОЧНО создаётся файл, а его не видно? (C++):

Не создаётся объект string на ровном месте! Почему? - C++
Ребята, чё-то я не пойму: #include &lt;string&gt; #include &lt;stdio.h&gt; #include &lt;iostream&gt; using namespace std; int main () { char...

Почему при инициализации строки, сначала создаётся пустой объект? - C++
Чтобы при создании присвоить строке какое-то значение, можно использовать два способа: string str1(”bla-bla-bla”); или string str2 =...

Почему два раза создаётся объект с ОДНИМ И ТЕМ ЖЕ ИМЕНЕМ? - C++
#include &lt;windows.h&gt; #include &lt;iostream&gt; using namespace std; class arr{ public: arr(){ cout &lt;&lt; &quot;Вызов конструктора по...

Не создаётся exe файл - C++
Вот код, создаю проекта в визуал студио, компилирую, выдаёт ошибку что не найдет exe #include &lt;iostream&gt; #include &lt;fstream&gt; ...

Не создаётся объектный файл - C++
Необходимо создать объектный файл вот код: #include &lt;stdio.h&gt; //#include &lt;conio.h&gt; extern &quot;C&quot; void asmproc(char ch, unsigned...

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

30
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
18.04.2011, 23:40 #2
Создал. В корне C.
0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
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
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.04.2011, 07:44 #4
Посмотри снова в корне.
0
accept
4825 / 3246 / 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 же по сути просто-напросто генерит строку символов, не совпадающую ни с одним из названием файлов, которые есть в текущем каталоге.
неправильно
0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
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
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
19.04.2011, 11:03 #7
Цитата Сообщение от kravam
...Так что всё верно.
нет, там нигде нет про текущий каталог
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.04.2011, 11:04 #8
Странная какая то тем, ТС сам постит решения, потом их екритикует, а задачу не говорит.
0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
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
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.04.2011, 12:03 #10
Цитата Сообщение от kravam Посмотреть сообщение
Тем самым я говорю: я пытался делать то-то и то-то но это мне нпе подходит по тем-о и тем-то причинам.
Пока я вижу: "Я пытался сделать, у меня не получается". А что не получилось, постеепенно становится не понятно. Показать свой код надо и не только для демонтрации. Фокус ещзё вот в чём: если у тебя что то не получилось, то не видя твоего кода подсказать что либо нему проблематично и отвечающим остаётся сочинять всё самим, а тебе потом фиг знает как разбираться в коде, не похожем не толко на твой, но и между собой, + не факт, что захотят с этим возится. А так надо только дополнить то, что уже есть. А в како направлении дополнять ты сказал? Я, например, что то вообще не понял, о какоком сравнении имён файлов идёт речь и для чего оно нужно.

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

...А, не всё. Ещё хотелось бы увидеть пример кода, где tmpname принимает 2 аргумента (если такой код возможен в принципе). Ну всё, если я и щас непонятен, наверное, надо меня списывать в тираж.
0
taras atavin
3570 / 1753 / 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 секунды
При этом ответа по самому коду не было.
0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
19.04.2011, 12:12  [ТС] #13
Блин ну если я так же непонятен как и ты, то прошу прощения. Ну вот я продублирую свой пост:
Коль скоро tmpnam создаёт файл с уникальным именем, хотелось бы знать, в пределах какого каталога это имя уникально. Из официальной документации, представленной здесь, я этот вопрос не понял. Всё!

...А, не всё. Ещё хотелось бы увидеть пример кода, где tmpname принимает 2 аргумента (если такой код возможен в принципе). Ну всё, если я и щас непонятен, наверное, надо меня списывать в тираж.
0
taras atavin
3570 / 1753 / 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;
}
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
19.04.2011, 12:56 #15
Посмотрите функцию tempnam.
0
19.04.2011, 12:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2011, 12:56
Привет! Вот еще темы с ответами:

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

О том, почему нелюбим goto; как его правильно использовать; и чем в моем случае его можно заменить? - C++
Вот есть такой оператор всеми программистами нелюбимый. Goto называется. Говорят, что его использование всегда можно обойти и...

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

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


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

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

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