На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Файловый указатель ВСЕГДА равен NULL, если имя файла получено через tmpnam , C, C89, VS 2010
    Всем хай! Сходу к делу!

    Хапнул проблему на легком месте.
    Вот на таком коде:

    ExpandedWrap disabled
          FILE* f;
          char name_file[ BUFSIZ ];
       
          tmpnam( name_file );
          f = fopen( name_file, "wb" );
          if ( f == NULL )
          {
              printf( "Error create binary file!" );
          }


    всегда f == NULL.
    в отладчике посмотрел, чему равно временное имя файла, ну, вот такое, например: "\s6h8.".
    вот чего надо изменить, подскажите плиз
    ----------------
    в справке почитал немного про эту функцию, вроде так можно делать, хотя еще есть др. способ, типа:
    ExpandedWrap disabled
      char* name_file = tmpnam( NULL );

    но этот способ буду позже пробовать

    спс. за внимание

    Добавлено
    пробовал на разных режимах еще "wb", "rb" "r", "r+" и пр. - 0 разницы -> ошибка создания файла и все
      Имена файлов не могут оканчиваться на точку. Добавьте расширение, любое. Хоть "tmp" или "a" или "0".

      "\s6h8.tmp" или "\s6h8.a" или "\s6h8.0".

      А еще, возможно, нет доступа без прав Администратора/Системы к корневому каталогу диска.

      Достаточно добавить в начале точку и тогда путь станет локальным.

      ".\s6h8.tmp" или ".\s6h8.a" или ".\s6h8.0".
      Сообщение отредактировано: macomics -
        решил вот так прогнать и посмотреть, что там генерится в цикле, вот результат:
        ExpandedWrap disabled
              int i;
              FILE* f;
              char name_file[ BUFSIZ ];
           
              for ( i = 1; i <= 10; i++ )
              {
                  tmpnam( name_file );
                  printf( "\n%s", name_file );
              }
              f = fopen( name_file, "r+" );
              if ( f == NULL )
              {
                  printf( "\n\nError create binary file!" );
              }


        \s6pg.
        \s6pg.1
        \s6pg.2
        \s6pg.3
        \s6pg.4
        \s6pg.5
        \s6pg.6
        \s6pg.7
        \s6pg.8
        \s6pg.9

        Error create binary file!

        Для продолжения нажмите любую клавишу . . .

        -----------------------------
        т е делалась попытка создать файл с именем "\s6pg.9" и все равно ошибка

        неужели, действительно, проблема с правами..это плохо, т к придется вручную добавлять путь что ли, мда уж..

        Добавлено
        ок, попробую добавить "." в начале
          Цитата FasterHarder @
          неужели, действительно, проблема с правами..это плохо, т к придется вручную добавлять путь что ли, мда уж..

          Цитата FasterHarder @
          ок, попробую добавить "." в начале

          Не нужно ничего добавлять в начале. Попробуй вот так:

          ExpandedWrap disabled
            #include <stdio.h>
             
            int main() {
                int i;
                FILE *f;
                char name_file[BUFSIZ] ={2};
             
                for (i = 1; i <= 10; i++) {
                    tmpnam(name_file);
                    printf("%s\n", name_file);
                }
                f = fopen((name_file+1), "w+");  // <--------------- см.тут (п.1 и п.2)
                if (f == NULL) printf("\n\nError create binary file!");
                return 0;
            }

          1) Для создания файла используй w или w+ вместо r+
          2) Если ты используешь не name_file, а (name_file+1), то избавишься от бэкслэша, который генериться в начале имени. В Windows системах он не может быть в имени файла, с помощью него формируется путь. Поэтому он не нужен :rolleyes:
            Majestio, ок, спс., попробую
            режимы я все знаю вроде, просто тогда экспериментировал
              Ok. Обрати внимание и на п.2 :yes:
                Majestio, все получилось, спс!
                хитро ты, конечно, обманул fopen через name_file + 1

                вот, как у меня все работает ( оставляю в первую очередь для себя, т к это проблема еще всплывет ):
                ExpandedWrap disabled
                      FILE* f;
                      char name_file[ BUFSIZ ];
                   
                   
                      tmpnam( name_file );
                      printf( "%s\n%s\n", name_file, name_file + 1 );
                   
                      f = fopen( name_file + 1, "wb" );
                      if ( f == NULL )
                      {
                          printf( "ERROR!" );
                      }
                      else
                      {
                          printf( "CREATE!" );
                          fclose( f );
                      }


                Добавлено
                а почему в справке НИ грамма не сказано о проблеме со слешем, вот жеж...
                там столько всего написано, целая поэма, а об этом ни слова; а может я плохо читал, ну ладненько

                Добавлено
                Majestio, кстати, а если слеш убран, он при закрытии прожки сможет его уничтожить ( найти ) или проблемы будут, хм...
                  Цитата FasterHarder @
                  а почему в справке НИ грамма не сказано о проблеме со слешем, вот жеж...
                  Об этом написано в справке по формированию путей к файлам и папкам для программ Windows.

                  Абсолютные пути:
                  widech
                  \\.\<letter>:\<path>\<file_name>.<ext>

                  ansi
                  <letter>:\<path>\<file_name>.<ext>


                  Относительные пути:
                  от корня диска
                  \<path>\<file_name>.<ext>

                  от текущего каталога
                  .\<path>\<file_name>.<ext>
                  <path>\<file_name>.<ext>
                  <file_name>.<ext>

                  Относительные пути с дополнительной обработкой (от текущего каталога)
                  .\<path>\<file1_name>.<ext>\<path>\<file2_name>.<ext>
                  <path>\<file1_name>.<ext>\<path>\<file2_name>.<ext>

                  Возможно и еще что-то есть, но я пока вспомнил только такие варианты.

                  Добавлено
                  Вот. Нашел страницу.
                  Сообщение отредактировано: macomics -
                    Цитата FasterHarder @
                    Majestio, все получилось, спс!
                    хитро ты, конечно, обманул fopen через name_file + 1

                    Не вопрос, конечно обращяйся - чем смогу, помогу.

                    Скрытый текст
                    Хотя знаешь ... Не знаю как избавиться от censored-осадочка ... Когда-то, в мою бытность тут на форуме, в реинкарнации JoeUser, я тебе пытался помочь советами ... а ты так меня тогда censored грязными тряпками, что я почти потерял веру в человечество. Но потом, уже после восстановления на исходниках, я подумал ... да censored как хотите! Я пришел сюда обмениваться полезной инфой, профессиональной. По-честному. А все эти ваши эмоции-шмоции я на пропеллере вертел. И после этого я ... познал ДЗЕН :lol:

                    Кстати, можешь не извиняться - это просто лишняя трата времени. Я отношусь ко всем одинаково - нейтрально. Как говорят киргизы: c’est la vie.
                    !
                    >:(


                    Цитата FasterHarder @
                    хитро ты, конечно, обманул fopen через name_file + 1

                    Не хитро ... обычная адресная арифметика, плюс ... заморочки венды.
                    Сообщение отредактировано: Qraizer -
                      Цитата Majestio @
                      Majestio, кстати, а если слеш убран, он при закрытии прожки сможет его уничтожить ( найти ) или проблемы будут, хм...

                      Ай донт андерстенд!!!
                      Я думаю Qraizer тут нужен, я не понимаю вопроса. Вызываю Qraizer. Аааа-хала-махала, приди и ответь!!! :wall:
                        Цитата Majestio @
                        Я думаю Qraizer тут нужен, я не понимаю вопроса. Вызываю Qraizer. Аааа-хала-махала, приди и ответь!!!
                        Сможет. Вы же указатель храните на начало вместе с бэкслеш, а передаете в функцию указатель на следующий за бэкслеш символ. Уничтожать будет ваша функция, в которой хранится правильный указатель. А функция, в которую передали модифицированный указатель, не "уничтожает" (высвобождает) память. Максимум обратится к этой строке чтобы скопировать из нее текст в собственные буферы.
                        Сообщение отредактировано: macomics -
                          tmpnam() создаёт уникальное имя. Слэш в начале явным образом намекает, что это имя уникальное для корня текущего диска. Создание там файлов запросто может блокироваться ОСью на уровне прав доступа, которое можно обойти повышением прав до админских. Создавая файл с текущем каталоге ты теряешь гарантию уникальности его имени, если только текущим не является как раз корневой.
                          Но проблема с этой функцией этим не исчерпывается. Между вызовами tmpnam() и fopen() может вклиниться другой процесс. Намёк, думаю, понятен. Я бы не рекомендовал использоваться эту функцию вовсе. Почему бы не использовать tmpfile()? У неё другой минус: портабельного способа узнать имя такого файла не существует. Но а оно надо ли?

                          Добавлено
                          P.S.
                          ExpandedWrap disabled
                            #include <stdio.h>
                             
                            int main( void )
                            {
                              printf("tmpnam() returns '%s'\n", tmpnam(NULL));
                            }
                          ExpandedWrap disabled
                            tmpnam() returns 'C:\Users\F6BD~1\AppData\Local\Temp\se4s.0'
                          VS 2019
                          Сообщение отредактировано: Qraizer -
                            Qraizer, спс)
                            как я понял, надо выкинуть tmpnam в корзину и присмотреться к tmpfile - ок
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0472 ]   [ 16 queries used ]   [ Generated: 29.11.22, 09:22 GMT ]