Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.236.86.184] |
|
Сообщ.
#1
,
|
|
|
Всем хай! Сходу к делу!
Хапнул проблему на легком месте. Вот на таком коде: 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.". вот чего надо изменить, подскажите плиз ---------------- в справке почитал немного про эту функцию, вроде так можно делать, хотя еще есть др. способ, типа: char* name_file = tmpnam( NULL ); но этот способ буду позже пробовать спс. за внимание Добавлено пробовал на разных режимах еще "wb", "rb" "r", "r+" и пр. - 0 разницы -> ошибка создания файла и все |
Сообщ.
#2
,
|
|
|
Имена файлов не могут оканчиваться на точку. Добавьте расширение, любое. Хоть "tmp" или "a" или "0".
"\s6h8.tmp" или "\s6h8.a" или "\s6h8.0". А еще, возможно, нет доступа без прав Администратора/Системы к корневому каталогу диска. Достаточно добавить в начале точку и тогда путь станет локальным. ".\s6h8.tmp" или ".\s6h8.a" или ".\s6h8.0". |
Сообщ.
#3
,
|
|
|
решил вот так прогнать и посмотреть, что там генерится в цикле, вот результат:
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" и все равно ошибка неужели, действительно, проблема с правами..это плохо, т к придется вручную добавлять путь что ли, мда уж.. Добавлено ок, попробую добавить "." в начале |
Сообщ.
#4
,
|
|
|
Цитата FasterHarder @ неужели, действительно, проблема с правами..это плохо, т к придется вручную добавлять путь что ли, мда уж.. Цитата FasterHarder @ ок, попробую добавить "." в начале Не нужно ничего добавлять в начале. Попробуй вот так: #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 системах он не может быть в имени файла, с помощью него формируется путь. Поэтому он не нужен |
Сообщ.
#5
,
|
|
|
Majestio, ок, спс., попробую
режимы я все знаю вроде, просто тогда экспериментировал |
Сообщ.
#6
,
|
|
|
Ok. Обрати внимание и на п.2
|
Сообщ.
#7
,
|
|
|
Majestio, все получилось, спс!
хитро ты, конечно, обманул fopen через name_file + 1 вот, как у меня все работает ( оставляю в первую очередь для себя, т к это проблема еще всплывет ): 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, кстати, а если слеш убран, он при закрытии прожки сможет его уничтожить ( найти ) или проблемы будут, хм... |
Сообщ.
#8
,
|
|
|
Цитата 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> Возможно и еще что-то есть, но я пока вспомнил только такие варианты. Добавлено Вот. Нашел страницу. |
Сообщ.
#9
,
|
|
|
Цитата FasterHarder @ Majestio, все получилось, спс! хитро ты, конечно, обманул fopen через name_file + 1 Не вопрос, конечно обращяйся - чем смогу, помогу. Скрытый текст Хотя знаешь ... Не знаю как избавиться от censored-осадочка ... Когда-то, в мою бытность тут на форуме, в реинкарнации JoeUser, я тебе пытался помочь советами ... а ты так меня тогда censored грязными тряпками, что я почти потерял веру в человечество. Но потом, уже после восстановления на исходниках, я подумал ... да censored как хотите! Я пришел сюда обмениваться полезной инфой, профессиональной. По-честному. А все эти ваши эмоции-шмоции я на пропеллере вертел. И после этого я ... познал ДЗЕН Кстати, можешь не извиняться - это просто лишняя трата времени. Я отношусь ко всем одинаково - нейтрально. Как говорят киргизы: c’est la vie. ! Цитата FasterHarder @ хитро ты, конечно, обманул fopen через name_file + 1 Не хитро ... обычная адресная арифметика, плюс ... заморочки венды. |
Сообщ.
#10
,
|
|
|
Цитата Majestio @ Majestio, кстати, а если слеш убран, он при закрытии прожки сможет его уничтожить ( найти ) или проблемы будут, хм... Ай донт андерстенд!!! Я думаю Qraizer тут нужен, я не понимаю вопроса. Вызываю Qraizer. Аааа-хала-махала, приди и ответь!!! |
Сообщ.
#11
,
|
|
|
Цитата Majestio @ Сможет. Вы же указатель храните на начало вместе с бэкслеш, а передаете в функцию указатель на следующий за бэкслеш символ. Уничтожать будет ваша функция, в которой хранится правильный указатель. А функция, в которую передали модифицированный указатель, не "уничтожает" (высвобождает) память. Максимум обратится к этой строке чтобы скопировать из нее текст в собственные буферы. Я думаю Qraizer тут нужен, я не понимаю вопроса. Вызываю Qraizer. Аааа-хала-махала, приди и ответь!!! |
Сообщ.
#12
,
|
|
|
tmpnam() создаёт уникальное имя. Слэш в начале явным образом намекает, что это имя уникальное для корня текущего диска. Создание там файлов запросто может блокироваться ОСью на уровне прав доступа, которое можно обойти повышением прав до админских. Создавая файл с текущем каталоге ты теряешь гарантию уникальности его имени, если только текущим не является как раз корневой.
Но проблема с этой функцией этим не исчерпывается. Между вызовами tmpnam() и fopen() может вклиниться другой процесс. Намёк, думаю, понятен. Я бы не рекомендовал использоваться эту функцию вовсе. Почему бы не использовать tmpfile()? У неё другой минус: портабельного способа узнать имя такого файла не существует. Но а оно надо ли? Добавлено P.S. #include <stdio.h> int main( void ) { printf("tmpnam() returns '%s'\n", tmpnam(NULL)); } tmpnam() returns 'C:\Users\F6BD~1\AppData\Local\Temp\se4s.0' |
Сообщ.
#13
,
|
|
|
Qraizer, спс)
как я понял, надо выкинуть tmpnam в корзину и присмотреться к tmpfile - ок |