var
a : file of char;
................
assign(f,'myfile.dat');
{$I-} {Отключить контроль ошибок ввода-вывода}
reset(f);
{$I+} {Включить контроль ошибок ввода-вывода}
if IOResult <> 0 then
Begin
.............. {файл не существует}
End
else
Begin
.............. {файл существует}
End;
..............
IOResult - с чем это связано?
_____________________________________________
{$I-}
program Roads;
uses
Crt;
const lim=30;
type mas=array [1..lim] of word;
var
quant:byte;
choice:byte;
road:mas;
k:byte;
ioresultQuant, ioresultLength:integer;
Procedure Intro(var k:byte);
begin
ClrScr;
Writeln('Roads');
Writeln;
Repeat
Writeln('next - enter 1, quit - enter 0');
Readln(k);
Until ((k=0)or(k=1)) and (Ioresult=0);
end;
Procedure ReadQuant(var quant:byte;var ioresultQuant:integer);
begin
ClrScr;
Writeln;
Repeat
Writeln('Enter the quantity of the roads you wish to enter (2-30)');
Readln(quant);
ioresultQuant:=Ioresult;
Until ((quant>=2)and(quant<=30)) and (Ioresult=0);
end;
Procedure ReadLength(quant:byte; var road:mas;var ioresultLength:integer);
Var z:byte;
begin
ClrScr;
z:=0;
Writeln;
Repeat
z:=z+1;
Repeat
Writeln('Please enter length (1..300) of a road number ',z);
Readln(road[z]);
ioresultQuant:=Ioresult;
Until ((road[z]>=1)and(road[z]<=300)) and (Ioresult=0);
Until z=quant;
end;
Procedure SearchMin(quant:byte; var road:mas; var choice:byte);
var i,j:byte;
begin
choice:=1;
for j:=choice+1 to quant do
begin
if road[j]<road[choice] then begin choice:=j; end;
end;
end;
Procedure ChoiceOut(choice:byte; var k:byte);
begin
ClrScr;
Writeln;
Writeln('The driver will choose a road number ', choice);
Writeln;
Repeat
Writeln('reset - enter 1, quit - enter 0');
Readln(k);
Until ((k=0)or(k=1)) and (Ioresult=0);
end;
begin
Intro(k);
If k=1 then
Repeat
ReadQuant(quant,ioresultQuant);
ReadLength(quant, road,ioresultLength);
SearchMin(quant,road,choice);
ChoiceOut(choice,k);
Until k=0;
end.
{$I+}
_________________________________________________
Прошу особое внимание обратить на процедуры ReadQuant и ReadLength, в них как выходные (наряду с другими) используются переменные ioresultQuant и ioresultLength, которым присваивается значение ф-ии IOResult.
Далее: в кажой процедуре имеется цикл (если число введено вне диапазона или осуществлен нецифровой ввод (IOResult<>0)), то запрос на ввод повторяется.
Так вот. В этом ввиде программа работает нормально.
Если же избавиться от этих переменных - ioresultQuant и ioresultLength, которые, по идее, совершенно ни на что не влияют, то при нецифровом вводе в процедуре номер 1 (Intro) - запрос на ввод повторится, и если будет введено правильное значение, то программа вызовет следующую процедуру - ReadQuant, где, при нецифровом вводе программа зависнет (зациклится), хотя условия цикла в процедуре ReadQuant те же, что и в Intro?
Почему так???
но я обнаружил что у тебя переменные quant,road[z]
"несоответствие типов" и вообще я паскаль не знаю
Функция IOResult: Integer возвращает целое число, соответствующее коду последней ошибки ввода-вывода. При нормальном завершении операции функция вернет значение 0. Значение функции IOResult необходимо присваивать какой-либо переменной, так как при каждом вызове функция обнуляет свое значение.
Цитата:
Originally posted by UjinNash
Функция IOResult: Integer возвращает целое число, соответствующее коду последней ошибки ввода-вывода. При нормальном завершении операции функция вернет значение 0. Значение функции IOResult необходимо присваивать какой-либо переменной, так как при каждом вызове функция обнуляет свое значение.
Функция IOResult: Integer возвращает целое число, соответствующее коду последней ошибки ввода-вывода. При нормальном завершении операции функция вернет значение 0. Значение функции IOResult необходимо присваивать какой-либо переменной, так как при каждом вызове функция обнуляет свое значение.
А разве, когда я использую ее для сравнения - она не вызывается?
Не знаю, как у тебя там без переменных твоих вспомогательных, но такая фишка:
repeat
...
res:=ioruesult;
until ioresult=0;
не прокатит.
При работе с этой функцией лучше придерживаться следующей схемы:
writeln(f,...);
res:=ioresult;
[работа с res]
или использовать ioresult не больше одного раза после вызова
правильно работать с ioresult вот так:
Тогда уж
{$I+}
writeln(f,'smth');
{$I-}
if ioresult<>0 then
begin
...
writeln('error');
halt
end;
...
видишь-ли прежде чем писать в файл его сначала надо открыть и ежели файла нет то получишь ошибку, именно поэтому проверяется открытие файла!
Цитата:
Originally posted by Gauss
видишь-ли прежде чем писать в файл его сначала надо открыть и ежели файла нет то получишь ошибку, именно поэтому проверяется открытие файла!
видишь-ли прежде чем писать в файл его сначала надо открыть и ежели файла нет то получишь ошибку, именно поэтому проверяется открытие файла!
Само собой.
При этом одно другому не мешает.
Цитата:
Originally posted by DarkAng
Само собой.
При этом одно другому не мешает.
Само собой.
При этом одно другому не мешает.
если удалось открыть файл для записи, дальнейшие проверки не имеют смысла, они всегда будут говорить IOResult=0
Вот если ты его закрываешь и открываешь по новой тогда есть смысл по новой проверять
Цитата:
Originally posted by Gauss
если удалось открыть файл для записи, дальнейшие проверки не имеют смысла, они всегда будут говорить IOResult=0
Вот если ты его закрываешь и открываешь по новой тогда есть смысл по новой проверять
если удалось открыть файл для записи, дальнейшие проверки не имеют смысла, они всегда будут говорить IOResult=0
Вот если ты его закрываешь и открываешь по новой тогда есть смысл по новой проверять
По-моему, это не совсем так. Насколько я знаю, ioresult связана почти с любой файловой операцией, если включен {$I+}. При writeln или readln тоже может возникнуть ошибка (например, переполнение диска или конец файла соответственно, или просто ошибка чтения/записи на диск).
Так что желательно проверять каждую файловую операцию, кроме, может быть, close. :)