Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

fopen() и Vista

40K
17 января 2009 года
*Denis
6 / / 16.09.2008
юзаю Borland C++ Builder 2006 и WinXP, взял новый ноут (они все щас с Vista), установил Borland C++ Builder 2006, попробовал - вроде всё как обычно, без происшествий, но вот такой вот код:

 
Код:
f = fopen("base\\stat.dat", "r+b");

     if (!f) { ShowMessage("Sorry, man..."); }


говорит мне "Извини, мол, не могу типа..."
Я полез в папку где лежит мой проект и откомпилированный экзешник
и проверил факт наличия сначала папки base, затем файла stat.dat
и не поверил своим глазам - они там имеют место быть (вот вам истинный крест), ну ладно думаю, нечего выпендриваться, всякие папки создавать, сделаю просто в той же директории где экзешник файл с именем "1", меняю код:

 
Код:
f = fopen("1", "r+b");

     if(!f) { ... тут без изменений ...}


опять он мне говорит "Извини..." ладно, думаю, прости меня грешного и избавь от лукавого и делаю так:

 
Код:
FILE * f;
int a = 0, sz = sizeof(int);

f = fopen("1", "wb"); // вот что делает крест животворящий!
fwrite(&a,sz,1,f);
fclose(f);

f = fopen("1", "rb"); // Алилуйя! Открылся!


Казалось бы что ещё нужно для счастья? Но я закрываю программу, а затем запускаю её снова через некоторое время (в коде ничего не менял, и пусть разверзнутся небеса и покарают меня если вру) и знаете что? Х.. на рыло, в смысле факт на лицо:

"Sorry, man..." говорит мне этот приспешник дьявола.

В общем я много молился постился и изгонял беса и наконец силы добра надо мной сжалились и установил некую закономерность:

файл ищется в той же папке, в какую я сам последний раз заходил виндовым проводником!

Т.е. код:

 
Код:
f = fopen("test", "wb");


создаёт файл там где последний раз я открывал папку, и если это папка с моими файлами проекта, то всё хорошо, а если я открывал что-то типа "C:\a\b\c\d" то там он и окажется!

В общем грехи мои тяжкие и вера моя слабеет, а потому токма на вас я уповаю, просвятите меня ламера, как мне быть с созданием и чтением файла в той же директории где лежит мой богом забытый экзешник - эта игрушка в руках дьявола?
490
17 января 2009 года
frid-karatel
357 / / 15.09.2007
Это не игрушка в руках дьявола... это куда сложней - тема для новичков, причем вопрос перебитый до дыр....
Для раздумья и поиска этой загадочной "Темы для новичков" скорей всего тебе дадут время подумать и попутешествовать по форуму в виде Гостя... :)

PS: Application->ExeName
40K
17 января 2009 года
*Denis
6 / / 16.09.2008
Я конечно буду в гиене огненной (в смысле и пусть меня забанят), но осмелюсь всё таки попросить подробностей, может моё ламерское происхождение и попытка поиска в этом форуме (неудачная) будут смягчающем обстоятельством? Просто, ради Христа киньте ссылку где?
92
17 января 2009 года
Тень Пса
2.2K / / 19.10.2006
Цитата:

To fix this, move your data files outside of the C:\Program Files folder.



Цитата:

Starting with Windows Vista, normal applications can no longer write files inside the "C:\Program Files" folder.



не припомню, чтобы ты сказал, что установил свой билдер НЕ в эту директорию....................................

Цитата:

Просто, ради Христа киньте ссылку где?



это тут не при чем :angry:

490
17 января 2009 года
frid-karatel
357 / / 15.09.2007
Вот "отрывок":
http://forum.codenet.ru/showpost.php?p=246112&postcount=3

А вот и ответы на будушие вопросы:
http://forum.codenet.ru/showthread.php?t=47990
40K
17 января 2009 года
*Denis
6 / / 16.09.2008
Да, Borland C++ Builder 2006 стоит в C:\Program Files\Borland\BDS\4.0
Но файлы проекта лежат в D:\C++\1\ (В эту папку собирается экзешник)

Раньше я с таким не сталкивался (опыт мой ничтожно мал + ламер я полный)
когда приходилось что то сохранить в файл или прочитать из него я в первом параметре fopen() никогда пути от корня не писал а просто указывал либо имя файла либо создавал папку и указывал путь относительно текущей папки типа:

fopen("папка1\\папка2\\мой_файл", "rb");

где "папка1" лежит в том же месте, что и мой экзешник.
Я почему то думал, что это очень правильно и удобно, т.к. при переносе на другой компьютер моя программа находит "мой_файл" или "папка1\папка2\мой_файл" относительно своей текущей директории. Собственно так всегда и было.

Я кажется нашёл в чём дело, видимо OpenTextFileDialog как-то влияет на это дело.
Если я не пользуюсь им в процессе работы программы, то для fopen() - текущая папка та, в которой выполняется программа, а если я запускаю диалог выбора файла, то после него текущая почему то становится папка, которую я вбрал через диалоговое окно. Через OpenTextFileDialog я открываю файлы на чтение анализирую их и закрываю, а затем, при необходимости, я уже сохраняю результат анализа в своём формате в свой файл fopen("1", "r+b");, а вместо этого возникает ошибка, т.к. fopen игнорирует указанный мной первый параметр и пытается открыть что-то типа fopen("папка_которая_последний _раз_открывалась_через_диалог\\1", "r+b"); вот.

Я прошу у всех прощения, что приплёл сюда Висту, она здесь не причём, это я загнался, под XP та же картина...

может это особенность функции fopen(), т.е. если ей открыть первый раз что-либо с указанием полного пути, а затем попытаться открыть второй раз что-то другое, но без указания полного пути, т.е. относительно текущего каталога, то получится такой ламерский прецедент как у меня. Ещё раз извиняюсь, что не собразил упомянуть об этом раньше, когда задавал вопрос, не подумал, что это как-то связано.
92
17 января 2009 года
Тень Пса
2.2K / / 19.10.2006
относительный путь, который ты используешь, это путь относительно ТЕКУЩЕЙ РАБОЧЕЙ ДИРЕКТОРИИ в системе, обычно...
490
17 января 2009 года
frid-karatel
357 / / 15.09.2007
При вызове любого диалога в программе значение пути сохраняется как путь по-умолчанию... Соответственно, без явно указанного пути при открытии файла проиходит подстановка пути по-умолчанию.

В твоем случае это, наоборот, неправильно - необходимо использовать именно Application->ExeName, так как необходимый файл лежит в папке (или подпапке) с самой программой.

PS: ExtractFilePath(Application->ExeName);
PSS: для fopen() необходимо использовать примерно так:
 
Код:
fopen((ExtractFilePath(Application->ExeName) + "base\\stat.dat").c_str(), "rb+");
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог