![]() |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
![]() ![]() |
![]() |
ApTeMoHnv |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 7 Пол: Мужской Реальное имя: Артём Репутация: ![]() ![]() ![]() |
При использовании в своём коде ReadLn'а (удивительно, да?
![]() ![]() ![]() Кстати, если писать просто "Read;", а не "ReadLn;", то всё нормально.. Но я хочу именно ReadLn... =\ Юзаю обычный Turbo Pascal досовский Спасибо за внимание. |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Ты хочешь здесь устроить соревнование телепатов что-ли? Код (строку Uses, определение файловой переменной и код открытия файла - обязательно, без этого говорить вообще не о чем, мало ли что ты там навертел) - в студию...
|
Contest |
![]()
Сообщение
#3
|
Группа: Модераторы Сообщений: 3 Пол: Мужской Реальное имя: Прием конкурсных работ Репутация: ![]() ![]() ![]() |
Мне вот эти слова особено понравились:
если бы я вставил этот РидЛн после "ассигна", не написав при этом "реврите/ресет" и не закрыв, то ... - может, автор и правда думает, что нужно открыть, закрыть, а потом писать..? ![]() -------------------- Чтобы подать работу на конкурс, пришлите ее в личном сообщении на имя этого пользователя.
Не забудьте указать название конкурса в сабжекте и в первой строке сообщения |
Lapp |
![]()
Сообщение
#4
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Извиняюсь, последний пост мой..
-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Lapp |
![]()
Сообщение
#5
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Сейчас зашел и обратил внимание на то, что как-то выпустил из виду в тот раз: на название темы. Если честно, я сам себе не верил, когда писал предыдущий пост, но в названии вот тоже явно говорится:
Цитата ReadLn после "assign" и "close" И тут уж приходится поверить в невозможное - то, что автор пытается писать в файл после его закрытия.. Ты когда домой приходишь - сначала открываешь дверь, потом захлопываешь и только после этого пытаешься войти?? И тогда возникает вопрос: а как же Read-то отрабатывал?.. ![]() Еще отвечу на фразу автора: Цитата ошибка "Файл не открыт для ввода", а функция Readln (прочитать), а не Writeln (записать). Ничего тут неправильного нет. Чтение (Read, ReadLn) - это и есть ввод (input), а запись (Write, WriteLn) - это вывод (output). Поскольку ввод понимается как ввод данных в процесс (работающую программу), а вывод - как запись в файлы (или устройства). Такова общая модель в программировании, привыкай. И она вполне естественная, если подумать. Представь себя в роли процесса: ты вводишь информацию в свой мозг, читая книги (или читая ввод устройств: ушей, глаз..), потом обрабатываешь ее мозгом и выводишь результат, записывая его в тетрадь (или передавая команды на устройства: руки, ноги..) Считать, что чтение есть "вывод и файла" - это часто встречающаяся ошибка у начинающих. Вникни в модель, которую я привел выше, и все встанет на свои места. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Lapp, а ты что, никогда не завершал программу ReadLn-ом, чтобы не жать на Alt+F5, а сразу посмотреть на результаты? Чего ж тогда тебе
Цитата приходится поверить в невозможное , когда то же самое делает автор?Цитата(Автор) обычная функция ReadLn (даже без дополнительных параметров у него вылетает... А вот почему? Что он делал до этого??? Я ничего и никогда не спрашиваю просто так. И совсем не просто так попросил привести Цитата(me) строку Uses, определение файловой переменной , с которыми работает автор. Ибо кодbeginбудет - и должен - вылетать именно по 104 ошибке (под TP7). Меня же интересует не это... Меня больше интересует в данной ситуации не то, почему НЕ отработал ReadLn, а то, почему при этом отработал Read... |
Lapp |
![]()
Сообщение
#7
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
когда то же самое делает автор? Боюсь, что не то же самое ![]() А это: обычная функция ReadLn (даже без дополнительных параметров типа readln(f,1)) вообще превращается в нечто для вылетания ошибки - можно интерпретировать либо так, что автор считает за параметры только единицу, либо (что скорее), что автор все же закрыл input. Это очень вероятно, имя input так и просится для файла. больше интересует в данной ситуации не то, почему НЕ отработал ReadLn, а то, почему при этом отработал Read... Этот вопрос я тоже задавал. Ждем разъяснений автора ![]() -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
ApTeMoHnv |
![]()
Сообщение
#8
|
Группа: Пользователи Сообщений: 7 Пол: Мужской Реальное имя: Артём Репутация: ![]() ![]() ![]() |
Боюсь, что не то же самое ![]() Lapp, как раз, ты меня не понял) Я ж конечно не настолько чайник, чтоб assign'ить, close'ить файл, а потом пытаться в него писать. "ReadLn;" я уже использую после этого (и это вообще никак не относится к файлу), чтобы, как раз как понял volvo, ждать нажатия Enter, вместо применения более длинного кода. beginбудет - и должен - вылетать именно по 104 ошибке (под TP7). Меня же интересует не это... Меня больше интересует в данной ситуации не то, почему НЕ отработал ReadLn, а то, почему при этом отработал Read... Вот.. У меня как раз код с assign(input,'blablabla.txt');. Использовал input, т.к. работал с файлами до этого только один раз. А вот сегодня спросил у препода, почему ошибка при РидЛне. input и output ведь какие-то стандартные "что-то-там". Но всё-равно непонятно, почему он всё ещё обрабатывает ReadLn, как-будто всё ещё работает с файлом, ведь я его закрыл, и Паскаль ведь должен был про него "забыть"?) Да ещё и параметры, в какой файл "читать", не задаю.. А про просто "read;", не знаю, но работает) Понял, вроде, что надо задавать в var переменную.. Так.. У меня раньше было (остальные куски вырезал, т.к. они как мне кажется не имеют отношения к делу): uses crt,dos; Теперь: uses crt,dos; Но теперь компилятор около "readln(save,cha[i]);" мне пишет ошибку 63: Invalid file type. Я так понял, мне нужен другой файловый тип..? Там какие-то типизированные, текстовые, нетипизированные, фиг разберёшься. У меня, похоже, типизированный.. Мне надо его сделать текстовым? В чём тогда их различие? Прочитал какие-то страницы в учебнике, но так и не понял. Сообщение отредактировано: ApTeMoHnv - 25.04.2009 22:48 |
TarasBer |
![]()
Сообщение
#9
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
: uses crt,dos; Стандартный ReadLN работает именно через input. По умолчанию input открыт, и связан с вводом с клавиатуры. Ты же направил его на другой файл, закрыл и всё. Можно направить его обратно на клавиатуру строчкой Assign(input, ''); Reset(input); Но лучше стандартные файловые переменные вообще не трогать, чтобы такой путаницы не было. Их трогают только на олимпиадах по программированию, когда ввод идёт только из файла taskname.in. Это в угоду скорости написания в ущерб стилю. Цитата Теперь: uses crt,dos; Мне надо его сделать текстовым? Да. Цитата В чём тогда их различие? Прочитал какие-то страницы в учебнике, но так и не понял. В том, что типизированными файлами очень удобно работать с бинарниками. Вы ведь когда файл левого расширения открываете, то видите там какую-то кашу? Вот для таких и придуманы типизированные файлы. -------------------- |
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
А теперь, что называется "вопрос на засыпку". Каков будет результат запуска двух следующих программ:
1) var X: integer; 2) var X: integer;(не запуская программ, естественно)? Не забываем, что Read/Write НЕ являются процедурами (хотя Турбо-Паскалевские доки упорно утверждают обратное)... |
ApTeMoHnv |
![]()
Сообщение
#11
|
Группа: Пользователи Сообщений: 7 Пол: Мужской Реальное имя: Артём Репутация: ![]() ![]() ![]() |
По-идее, в 1ом случае, будет выдавать ошибку 104, как если бы было написано просто "readln;". А если смотреть по опыту, то во втором пропишется в файл, и будет ждать нажатия любой клавиши
![]() TarasBer, спасибо за разъяснения! |
volvo |
![]()
Сообщение
#12
|
Гость ![]() |
Цитата А если смотреть по опыту, то во втором пропишется в файл, и будет ждать нажатия любой клавиши По опыту? Ну, тогда запусти второй вариант и посмотри практически... И попробуй объяснить поведение программы. И, заодно, объясни мне, где ты тут нашел ожидание нажатия клавиши? Вот отсюда и все твои проблемы: ты не понимаешь, что просишь от программы. Начни с того, какая вообще разница между Read и ReadLn, что должна делать Read, и что - ReadLn. Если действительно хочешь разобраться. |
ApTeMoHnv |
![]()
Сообщение
#13
|
Группа: Пользователи Сообщений: 7 Пол: Мужской Реальное имя: Артём Репутация: ![]() ![]() ![]() |
Из источника по подготовке к информатике: "Особых различий при чтении и записи в использовании операторов Read и ReadLn нет. Часто процедуру ReadLn без параметров применяют в конце программы для задержки: до нажатия на клавишу <Enter> результат выполнения программы остается на экране. Это очень полезно делать для анализа результатов.". Я это и имел ввиду. Но то, что у меня не учитывал Enter, а сразу выходит (вылетает без ошибки) из программы без нажатия, это факт. И я не знаю почему. Чего-то особенного я вроде не писал.. Я вот поэтому и сказал, по опыту. Твои программы я не пробовал запускать. И я знаю, в чём разница между Read и Realn. Первая считывает информацию с клавиатуры после нажатия Энтер, не пропуская строки, а вторая после этого переходит на начало новой строки.
Есть одно подозрение... Возможно, виновата процедура отключения мигающего курсора:
|
TarasBer |
![]()
Сообщение
#14
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Но то, что у меня не учитывал Enter, а сразу выходит (вылетает без ошибки) из программы без нажатия, это факт. И я не знаю почему. Я объяснил вообще-то. Цитата Чего-то особенного я вроде не писал... Да-да, перенаправление основного потока ввода в никуда - это "ничего особенного"... -------------------- |
volvo |
![]()
Сообщение
#15
|
Гость ![]() |
Цитата Первая считывает информацию с клавиатуры после нажатия Энтер, не пропуская строки, а вторая после этого переходит на начало новой строки. Ну-ну... Во-первых, кто тебе сказал, что с клавиатуры? С потока ввода, который в настоящее время ассоциирован с клавиатурой - это да, но никак не с клавиатуры.Во-вторых, смотри что происходит: ты ассоциировал поток input с другим файлом, потом его закрыл... Что делает ReadLn? А вот что: она должна прочесть из потока символ перевода строки при любых условиях. Несмотря ни на что. У тебя файл input закрыт, поэтому ты при попытке чтения из него просто получаешь вылет по ошибке... Теперь смотрим на Read;. Что делает она? Она НЕ ОБЯЗАНА ничего читать из файла, потому что параметров нет, и читать, собственно, некуда. Посему Паскаль генерирует "пустышку", которая совершенно корректно ничего не делая, просто оставляет в покое файл. А закрыт он, или открыт - это ничего не меняет, в любом случае задержки до нажатия клавиши не будет. Как только ты напишешь Read(что-то);, ситуация меняется кардинальным образом. Теперь Read-у ЕСТЬ, что читать, он обязан прочесть то, что указано в списке параметров, будь то символ или число, или строку. А следовательно, вместо Read подставляется не "пустышка", а вызов процедуры, который читает из входного потока то значение, которое надо прочесть (скажем Read(ch); - если ch описан как Char, приведет к вызову ReadChar, а вызов Read(i) при i: Integer будет заменен на ReadInt), ты получаешь то же самое, что и в случае с ReadLn: при попытке чтения из закрытого потока - аварийный вылет из программы... А ты говоришь "знаю, в чем разница". Я ж дал подсказку, что Read - МАКРОС, а не процедура, а следовательно, раскрывается компилятором по-разному... Теперь понятнее, что происходит? |
ApTeMoHnv |
![]()
Сообщение
#16
|
Группа: Пользователи Сообщений: 7 Пол: Мужской Реальное имя: Артём Репутация: ![]() ![]() ![]() |
Вроде бы понятней.. Только вот почему при использовании зарезервированного слова "input" для именования файла и последующего его закрытия, эта ошибка вылетает, а при описании в var какого-нибудь файла (текстового в этом случае) и при его же закрытии, уже спокойно используется и Read;, и ReadLn; в качестве "ожидания нажатия"..?
Вот это я и не понимал) |
TarasBer |
![]()
Сообщение
#17
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
RTFM сообщение номер 9 в этой теме.
Потом что ReadLn по умолчанию работает именно с инпутом. -------------------- |
ApTeMoHnv |
![]()
Сообщение
#18
|
Группа: Пользователи Сообщений: 7 Пол: Мужской Реальное имя: Артём Репутация: ![]() ![]() ![]() |
А, всё.. Теперь точно понял.. Перечитал..)
В общем, всем спасибо! Узнал много нового ![]() |
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 13:17 |