Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2008, 21:13   #1
Викдон
Форумчанин
 
Аватар для Викдон
 
Регистрация: 11.11.2008
Сообщений: 161
Вопрос $I: автоматический контроль операций ввода-вывода.

$I: автоматический контроль операций ввода-вывода.
Вот проблемка есть, после проверки переменной ioresult я не могу вывести на экран сообщение "Ошибка"! вот отрывок кода:

if (IOresult<>0) then {Функция IOResult содержит в себе код ошибки}
begin
writeln('Ошибка ввода');
readln;
halt;{Выход из программы}
end;

а в этом коде все работает(я проверяю существует ли текстовый файл):

{$I-}
reset(text_file); {Открываем существующий файл для чтения}
if ioresult<>0 then
begin
write('Oshibka!!! Net faila');
readln;
halt; {выход из программы}
end;

Почему так? подскажите?
Викдон вне форума Ответить с цитированием
Старый 19.11.2008, 21:29   #2
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

А что, в первом случае вообще нет попытки открыть файл?
puporev вне форума Ответить с цитированием
Старый 19.11.2008, 22:05   #3
Викдон
Форумчанин
 
Аватар для Викдон
 
Регистрация: 11.11.2008
Сообщений: 161
По умолчанию

в первом случае вводится переменная:
readln(k);

if (IOresult<>0) then
begin
writeln('Ошибка ввода');
readln;
halt;{Выход из программы}
end;
Викдон вне форума Ответить с цитированием
Старый 19.11.2008, 22:22   #4
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Если я не съехал, то функция IOresult используется только при вводе данных из файла. Ввод переменных по типу контролирутся компилятором, по сути(диапазоны, ненужные символы и пр.) программно.
puporev вне форума Ответить с цитированием
Старый 19.11.2008, 22:36   #5
Викдон
Форумчанин
 
Аватар для Викдон
 
Регистрация: 11.11.2008
Сообщений: 161
По умолчанию

ну... я читал что ioresult возвращает код последней ошибки ввода/вывода.
При отключенном автоматическом контроле ввода-вывода, признак ошибки, возникшей при выполнении операции ввода-вывода, сохраняется во внутренней переменной, доступ к которой можно получить с помощью функции IOResult.

При установленном признаке ошибки ввода-вывода, все последующие обращения к операциям ввода-вывода игнорируются, признак ошибки остается без изменений.
Викдон вне форума Ответить с цитированием
Старый 19.11.2008, 22:37   #6
Викдон
Форумчанин
 
Аватар для Викдон
 
Регистрация: 11.11.2008
Сообщений: 161
По умолчанию

ну может я и не прав.)
Викдон вне форума Ответить с цитированием
Старый 19.11.2008, 22:41   #7
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Вы посмотрите в Хелпе Паскаля, в книгах, там только с файлами. Когда-то давно видимо ввод был только из файла и выход в файл.
Код начинался примерно
Program WWW(input,output);
делась проверка ввода вывода. Сейчас эта строчка не нужна, а проверку ввода вывода с файлами делают. Я лично никогда это не пишу и все работает. Если файл забыл создать, компилятор напомнит.
puporev вне форума Ответить с цитированием
Старый 19.11.2008, 22:52   #8
Викдон
Форумчанин
 
Аватар для Викдон
 
Регистрация: 11.11.2008
Сообщений: 161
По умолчанию

ну я проверял. функция ioresult возвращает любые ошибки ввода/вывода, просто в:
readln(k);

if (IOresult<>0) then
begin
writeln('Ошибка ввода');
readln;
halt;{Выход из программы}
end;

оператор writeln('Ошибка ввода'); выполняется, а вот задержа экрана(readln) нет.


Ну эту проверку делаю если спользовать exe-файл. так он просто вырубится, а если использовать ioresult он выведет сообщение об ошибке.
Викдон вне форума Ответить с цитированием
Старый 20.11.2008, 20:38   #9
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от Викдон Посмотреть сообщение
оператор writeln('Ошибка ввода'); выполняется, а вот задержа экрана(readln) нет.
Например, пользователь вводит 'abc'#$d#$a. Readln читает всё до перевода строки (предполагаемое число). Оказывается, что это не число, в InOutRes записывается код ошибки; #$d#$a остаются в буфере, и этот пустой остаток строки читает следующий readln. Таким образом, если нужна задержка, надо написать readln два раза.
Somebody вне форума Ответить с цитированием
Старый 20.11.2008, 21:21   #10
Викдон
Форумчанин
 
Аватар для Викдон
 
Регистрация: 11.11.2008
Сообщений: 161
По умолчанию

СПАСИБО!
а вот вопрос. мы вводим 'abc'#$d#$a. почему выдается ошибка только при прочтении 'abc'? а не просто буквы а?
Викдон вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перехват консольного ввода\вывода Артем5555555 Win Api 14 28.10.2008 23:20
Контроль ввода данных в классе oleg kutkov Общие вопросы C/C++ 1 14.04.2008 22:19