PDA

Просмотр полной версии : Файловая ошибка 105



dr.Jekill
24.03.2009, 23:03
Почему-то в файл не выводит:
var t:text; i:byte;begin assign(t,'Primer.txt'); rewrite(t); for i:=1 to 20 do writeln(t,'*'); close(t);end.

Naeel Maqsudov
24.03.2009, 23:08
Ну, при использовании досовского Turbo Pascal в Windows такое бывает. У меня после переустановки операционки Turbo Pascal перестал работать с файлами вообще.

dr.Jekill
24.03.2009, 23:30
Да - интересное кино!А как же обойти?

somewhere
24.03.2009, 23:37
105 говорит о том, что файл не открыт для записи. Значит сбой выходит где то в районе Rewrite. Тут как бы причина должна быть одна - файл залочен кем то или чем то. Т.е. он открыт и используется, либо общая длина пути вместе со всеми подпапками к этому файлу выше 80 символов

dr.Jekill
25.03.2009, 00:17
Ну это ясно. А что делать-то?Как программно сделать, чтобы файл во время выполнения программы использовался только этой программой? Есть еще какие-нибудь методы?

Duncon
25.03.2009, 09:03
В потоке открой, с опцией

f := TFileStream.Create('myFile.xz', fmCreate or fmShareCompat); // еще fmShareExclusive

dr.Jekill
25.03.2009, 14:09
Ну в Delphi c TStream все понятно - нужно подключить classes и Sysutils, а где их взять в Pascal для Dos? Как ни странно на другом компе ошибки 105 не возникает, а у меня даже после переустановки Паскаля работает только по такой схеме:assign-rewrite-close-reset.Нужно вывести дерево выражения в файл построчно в префиксной форме. Такая процедура записывает лишь корень дерева:


procedure ExitRez(r:TreePointer);
begin
if r<>nil then
begin
writeln(rez,r^.data);
Prefix(r^.left);
Prefix(r^.right);
end
end;

Дерево формируется из файла, в котором выражение записано в префиксной форме, так:


procedure Build(var p:TreePointer);
begin
new(p);
readln(fail,p^.data);
if (p^.data ='+') or (p^.data='-') or (p^.data ='*') or (p^.data ='/') then
begin
Build(p^.left);
Build(p^.right);
end
else
if (p^.data='exp') or (p^.data ='ln') or (p^.data ='cos') or (p^.data ='sin') then
begin
p^.left:= nil;
Build(p^.right);
end
else
begin
p^.left:= nil;
p^.right:= nil;
end
end;

somewhere
25.03.2009, 14:26
Чувствую что какие то непонятки со встроеным дос эмулятор, посему предлагаю
проверить

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contro l\Session Manager\Environment
ComSpec = %SYSTEMROOT%\System32\cmd.exe

Наличие самого файла по указанному пути, его размер и версию. У меня размер 395776, версия 5.1.2600.2180

Проблемы подобного рода были после установки какого то софта то ли для LAN то ли WAN и этот софт подменил интерпретатор на свой, после были глюки вплоть до дебилизма, например не работал "dir /p" писал что то вроде ключ не опознан

dr.Jekill
25.03.2009, 15:40
Проверил всё нормально: версия такая же, размер тот же.Должна ли процедура ExitRez заполнять файл элементами дерева построчно или код неверен?

somewhere
25.03.2009, 16:03
Должна в любом случае, даже если r^.data есть пустой стринг, но rez должен быть обязательно потом close и чтобы при его rewrite до этого никаких ошибок не было. И все же советую rez связать по полному пути, например c:\result.txt, потому что может быть косяк с определением текущей директорией, которая вполне может указывать на "c:\documents and sett....\Рабочий стол" и задается в свойствах ярлыка, запускающего Pascal. Текущую папку можно узнать использовав GetDir

Naeel Maqsudov
25.03.2009, 16:41
Стекущей директорией не связано. Turbo Pascal 7.0 у меня не работал с файлами категорически. Win2k SP4. Когда началась проблема не знаю. Возможно, что после замены жесткого диска с маленького IDE-шного на большой SATA-шный. Не смог побороть. Забил. Решит 7-ой Turbo Pascal похоронить.
А для решения всяких студенческих задач использую 2 инструмента
1) PascalABC.NET и
2) Еще есть одна поделка - виндовая среда разработки, использующая родной борландовый TPCW. Называется это безобразие TPW.
На сколько я понимаю, теперь в учебных заведениях на этих двух штуках народ как раз и сидит в основном.

dr.Jekill
25.03.2009, 21:04
Совсем шарики за ролики заходят:


procedure ExitRez(r:TreePointer);
begin
if r<>nil then
begin
writeln(rez,r^.data);
Prefix(r^.left);
Prefix(r^.right);
end
end;

А должно быть так:


procedure ExitRez(r:TreePointer);
begin
if r<>nil then
begin
writeln(rez,r^.data);
ExitRez(r^.left);
ExitRez(r^.right);
end
end;

Как копировал, код остался с другой процедуры (процедура должна рекурсивно вызывать себя, а не другую процедуру).В файл пишет как нужно, но в отношении файла по-прежнему работает лишь такая схема: assign-rewrite-close-reset.Нарисовался еще один глюк: компилирую pas, всё компилируется, но при работе программы почти на завершающем этапе выкидывает, игноририруя readln. Сообщений об ошибке нет. Запускаю еще несколько раз с таким же успехом. После этого все запускается и работает корректно. Что это? Еще один глюк TPascal'я?Я так понял стоит попробовать на PascalABC.NET?

AiK
26.03.2009, 02:24
Когда началась проблема не знаю.
А это не та древняя проблема связанная с тем, что в TP при работе с файлами где-то используется delay (который криво реализован), и на быстрых процах просто TP не успевает открыть файл на запись?

Если оно, то опытные собаководы рекомендуют в секцию uses включить wincrt.

dr.Jekill
26.03.2009, 03:25
Раскопал wincrt.pas, подключил, Ctrl+F9, послушно ложил в папку с программой все запрашиваемые модули и в итоге в Winprocs.Pas 'Error 85: ";" expected'. Может у кого есть tpu'шный?

somewhere
26.03.2009, 09:28
Ну поставь ему, то что он хочет, не велика проблема, или вот

BBB
26.03.2009, 11:41
Если оно, то опытные собаководы рекомендуют в секцию uses включить wincrt. Ну, мы еще в "ДОС-овские" времена пользовалисть библиотекой Turbo Professional, так что CRT не использовали, а использовали TpCRT.
Что любопытно, эти два модуля вообще конфликтовали. Т.е. если в собранной программе в каком-то месте цеплялся CRT, а в каком-то другом TpCRT, то при старте программа выдвала (на консоль) сообщение 'CTR/TpCRT conflict' и завершалась. Это в модуле TpCRT такая проверка была каким-то образом реализована.

Правда, не сорвсем ясно, как rewrite связана с CRT, ведь это стандартная функция (т.е. для ее вызова uses CRT делать не надо).

somewhere
26.03.2009, 16:51
Правда, не сорвсем ясно, как rewrite связана с CRT
А она и не связана, зато wincrt содержит AssignCrt, которая особым образом заполняет поля переменной типа Text, что позже позволяет rewrite работать как надо

dr.Jekill
28.03.2009, 14:59
Ну поставь ему, то что он хочет, не велика проблема, или вотТо же самое и точно в том же месте. Есть у кого-нибудь скомпилированный модуль? С ТP все по-прежнему, а в АВС всё работает корректно. Наверно перейду на него.Интресно, а кто в чем пишет?

Naeel Maqsudov
28.03.2009, 21:22
Да я сразу сказал, что это непоборимо.
Для студенческих задачек - ABC.
(Но надо учитывать, что там есть измеения и это уже фактически диалект)