f = fopen("base\\stat.dat", "r+b");
if (!f) { ShowMessage("Sorry, man..."); }
fopen() и Vista
Код:
говорит мне "Извини, мол, не могу типа..."
Я полез в папку где лежит мой проект и откомпилированный экзешник
и проверил факт наличия сначала папки base, затем файла stat.dat
и не поверил своим глазам - они там имеют место быть (вот вам истинный крест), ну ладно думаю, нечего выпендриваться, всякие папки создавать, сделаю просто в той же директории где экзешник файл с именем "1", меняю код:
Код:
f = fopen("1", "r+b");
if(!f) { ... тут без изменений ...}
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"); // Алилуйя! Открылся!
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" то там он и окажется!
В общем грехи мои тяжкие и вера моя слабеет, а потому токма на вас я уповаю, просвятите меня ламера, как мне быть с созданием и чтением файла в той же директории где лежит мой богом забытый экзешник - эта игрушка в руках дьявола?
Для раздумья и поиска этой загадочной "Темы для новичков" скорей всего тебе дадут время подумать и попутешествовать по форуму в виде Гостя... :)
PS: Application->ExeName
Я конечно буду в гиене огненной (в смысле и пусть меня забанят), но осмелюсь всё таки попросить подробностей, может моё ламерское происхождение и попытка поиска в этом форуме (неудачная) будут смягчающем обстоятельством? Просто, ради Христа киньте ссылку где?
Цитата:
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:
http://forum.codenet.ru/showpost.php?p=246112&postcount=3
А вот и ответы на будушие вопросы:
http://forum.codenet.ru/showthread.php?t=47990
Но файлы проекта лежат в 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(), т.е. если ей открыть первый раз что-либо с указанием полного пути, а затем попытаться открыть второй раз что-то другое, но без указания полного пути, т.е. относительно текущего каталога, то получится такой ламерский прецедент как у меня. Ещё раз извиняюсь, что не собразил упомянуть об этом раньше, когда задавал вопрос, не подумал, что это как-то связано.
относительный путь, который ты используешь, это путь относительно ТЕКУЩЕЙ РАБОЧЕЙ ДИРЕКТОРИИ в системе, обычно...
В твоем случае это, наоборот, неправильно - необходимо использовать именно Application->ExeName, так как необходимый файл лежит в папке (или подпапке) с самой программой.
PS: ExtractFilePath(Application->ExeName);
PSS: для fopen() необходимо использовать примерно так:
Код:
fopen((ExtractFilePath(Application->ExeName) + "base\\stat.dat").c_str(), "rb+");