kola kolin
Ученик
(175),
закрыт
4 года назад
Дополнен 4 года назад
команда которая не читается находится в самом низу кода перед end
Дополнен 4 года назад
если есть переменные типа real то не реагирует read с переменной типа string
Дополнен 4 года назад
тоесть я не могу комбинировать read с переменным string и real в одном коде
Gennady
Гений
(59312)
4 года назад
Замените все свои Read() на ReadLn() и будет вам счастье.
Фишка в том, что процедура Read() оставляет в буфере клавиатуры смвол перевода строки, который при чтении в строковую переменную и приводит к такому эффекту.
Процедура же ReadLn() очищает буфер клавиатуры полностью. Для проверки достаточно заменить Read(c) на ReadLn(c) и программа остановится в ожидании второго ответа юзера.
Источник: Учите матчасть
Модератор: Модераторы
У меня ReadLn – не работает…
Ничего не понимаю…
У меня ReadLn не работает…
Кликните, пожалуйста, у себя Ctrl+клик на ReadLn.
В каком uses находится ReadLn? (для текстовых файлов)
.
-
vitaly_l - долгожитель
- Сообщения: 3333
- Зарегистрирован: 31.01.2012 16:41:41
-
- Профиль
- Сайт
Re: У меня ReadLn – не работает…
bormant » 25.03.2013 13:33:49
ReadLn находится в модуле System, который подключен всегда вне вашего желания.
Поэтому, скорее всего, вы просто перекрыли System.ReadLn одноимённой процедурой в своём коде. Попробуйте в нужном месте вписать System.ReadLn в место ReadLn.
-
bormant - постоялец
- Сообщения: 402
- Зарегистрирован: 21.03.2012 11:26:01
Re: У меня ReadLn – не работает…
vitaly_l » 25.03.2013 14:03:58
bormant писал(а):ReadLn находится в модуле System
Юмор в том что его там нет…
Но ReadLn – начал работать, только я всё равно – не могу посмотреть где он лежит…
т.к. Ctrl+клик на ReadLn не работает.
Assign – показывает.
Reset – показывает.
Close(f); – показывает.
А ReadLn – нет… и простым поиском его в System нет, хотя там: и Assign и Reset и Close…
Но это ужен не актуально, т.к. файл начал считываться и я прочитал то, что хотел и запустил cdecl.
правда только текстовый файл, а не форматированный.
Спасибо Вам.
-
vitaly_l - долгожитель
- Сообщения: 3333
- Зарегистрирован: 31.01.2012 16:41:41
-
- Профиль
- Сайт
Re: У меня ReadLn – не работает…
Sergei I. Gorelkin » 25.03.2013 14:27:49
Readln не существует в виде процедуры, она преобразуется в последовательность вызовов fpc_read_text_sint, fpc_read_text_float и т.д.
-
Sergei I. Gorelkin - энтузиаст
- Сообщения: 1390
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
-
- Профиль
- ICQ
Re: У меня ReadLn – не работает…
vitaly_l » 25.03.2013 14:33:42
Sergei I. Gorelkin писал(а):Readln не существует в виде процедуры, она преобразуется в последовательность вызовов fpc_read_text_sint, fpc_read_text_float и т.д.
Спасибо – большое, добрый Sergei I. Gorelkin
-
vitaly_l - долгожитель
- Сообщения: 3333
- Зарегистрирован: 31.01.2012 16:41:41
-
- Профиль
- Сайт
Re: У меня ReadLn – не работает…
bormant » 25.03.2013 15:02:35
ReadLn не работает
и “не находится реализация ReadLn” — несколько разные вещи. А так да, Read(Ln)/Write(Ln)/Str — compiler magic — операторы/процедуры, созданные надъязыковыми средствами, вместо них компилятор подставляет специфичные случаю реализации.
-
bormant - постоялец
- Сообщения: 402
- Зарегистрирован: 21.03.2012 11:26:01
Re: У меня ReadLn – не работает…
vitaly_l » 25.03.2013 15:14:06
bormant писал(а):и “не находится реализация ReadLn” — несколько разные вещи.
Нет он у меня вначале отказывался работать, т.к. в Вашем примере было ReadLn(f,n); где n: integer; и он выдавал ошибку. когда заменил на String всё стало работать. И тестовые файлы грузятся и cdecl работает. А вот мои файлы, я пока ещё не дешифровал…
Но зато благодаря Вам понял систему программирования того программиста который писал модуль.
Теперь пытаюсь понять как его модуль дешифровал форматированный файл…
Самое обидное, что модуль возможно не работает из-за несовместимости или не того порядка в инициализации uses’ов…
/
-
vitaly_l - долгожитель
- Сообщения: 3333
- Зарегистрирован: 31.01.2012 16:41:41
-
- Профиль
- Сайт
Re: У меня ReadLn – не работает…
Alex2013 » 03.04.2013 13:32:50
Текстовые файлы лучше всего читать-писать через TStringList или если читается только часть файла через TFileStream
А кроме того с ошибками в/в через исключения работать надежнее
Что-то вроде …
- Код: Выделить всё
Function ReadFromFile (Fn:String; FilePos,Size :Longint):string;
Var
Data:String;
F:TFileStream;
I:Longint;
begin
Data:='';
if FileExists(FN) then begin
F:=TFileStream.Create(FN,fmOpenRead);
try
if FilePos+Size<=F.Size then
begin
f.seek(FilePos,soFromBeginning);
For I:=1 to Size do
begin
data:=data ;
f.Read(data[i],1);
end;
end
finally
f.free;
end;
ReadFromFile:=Data;
end
end;
- Alex2013
- долгожитель
- Сообщения: 2695
- Зарегистрирован: 03.04.2013 11:59:44
Вернуться в Lazarus
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12
Topic: Readln in lazarus pascal not working (Read 4489 times)
When I
writeln(‘enter number’);
readln(number);
writeln(‘enter number2’);
readln(number2);
it asks for the number and I type it and it reads it upon hitting return as it should.
The second writeln shows on screen but when I type a number it doesn’t show on the keyboard unless I type it a second time.
Any idea why this is happening?
Logged
Hi!
Your terminal window or cmd window is not high enough. Expand it to full screen.
Or:
-
write(‘enter number: ‘);
-
readln(number);
-
write(‘enter number2: ‘);
-
readln(number2);
Winni
Logged
Thank you very much for the response but neither of them worked.
Do you have anything else you can think of for me to try?
Logged
what OS are you on and can you please post the complete lines here ?
Btw, if that is the last line of the program and you are in console mode it seems, you need to place a readln as the last function so the console screen will stay open and wait for you to hit enter.
Logged
The only true wisdom is knowing you know nothing
Thanks.
Windows 10 version 1903
This happens with every keyboard input after the first one which works fine. The rest of them I have to type the number or letter a second time before it shows up on the screen and can be read in.
Actual Code is:
Write(‘Choose the Home team by number and hit enter ‘);
Readln(teamnumber);
HomeTeamAcronym := teamacronym[teamnumber];
t1 := teamnamelist[teamnumber];
Write(‘Choose the Visiting team by number and hit enter ‘);
Readln(teamnumber);
VisitingTeamAcronym := teamacronym[teamnumber];
Logged
Hi!
Yeah, that’s the trick – what Jamie said about the last line of code.
In the tradition of the 80s the last three lines of code have to look like this:
-
writeln (‘Thats all folks ……’);
-
readln;
-
end.
Buena note
Winni
Logged
I have the code you show here as my last 3 lines.
What I am referring to is early in a 10,000 line program where I am inputting what teams I want to use for a game.
The first writeln and readln the input number shows up on the screen on the first keystroke.
The second writeln and readlin I have to press the number on the keyboard twice for it to show up on the screen.
Now if I press 1 for team 1 and then hit enter twice then press 2 for team 2. The 2 does show up on the screen on the first press.
But this code is nowhere near the end of the program. It is at the very beginning and there are keyboard inputs throughout the entire program.
Logged
I think I solved it.
If I right click in the upper left corner of the command prompt and select “properties” then “Use Legacy Console” it works properly with my pascal programs.
Thanks everyone for giving me ideas on the fix.
Logged
I spoke too soon. It still doesn’t work.
I have to type 1 then enter then either enter or type 2 twice…sigh
Logged
I have to type 1 then enter then either enter or type 2 twice…sigh
What you describe sounds like there is an extra (unwanted) “read” somewhere in your code.
Can you reproduce the problem in a short, standalone program ? If you could post a short program that exhibits the problem, it would be easier to determine the cause.
Logged
FPC v3.0.4 and Lazarus 1.8.2 on Windows 7 SP1 64bit.
complete version:
-
program numbers;
-
{$ifdef mswindows}{$apptype console}{$endif}
-
var
-
number,number2:integer;
-
begin
-
writeln(‘enter number’);
-
readln(number);
-
writeln(‘enter number2’);
-
readln(number2);
-
writeln(number);
-
writeln(number2);
-
end.
Works (of course…..)….
Note Lazarus is -still – not really friendly with console programs and you should never (almost never) use such code in a GUI app if that is your confusion.
« Last Edit: November 05, 2019, 07:17:17 am by Thaddy »
Logged
I actually get compliments for being rude… (well, Dutch, but that is the same)
Thanks!
When I run your program it works!
Now I have to figure out why mine doesn’t.
Maybe its the top line: {$ifdef mswindows}{$apptype console}{$endif}
Logged
complete version:
program numbers;
{$ifdef mswindows}{$apptype console}{$endif}
var
number,number2:integer;
begin
writeln(‘enter number’);
readln(number);
writeln(‘enter number2’);
readln(number2);
writeln(number);
writeln(number2);
end.
Works (of course…..)….
Note Lazarus is -still – not really friendly with console programs and you should never (almost never) use such code in a GUI app if that is your confusion.
Is anyone able to look at my code and find the error for a small paypal donation?
Logged
Yes debugging is hard, but is something you must learn to do. Try adding extra writeln in your code to see where it fails.
Maybe you’re using just write instead of writeln?
Logged
When I debug and step into it line by line it works fine.
When I take the debug step by step out, it does not work and I have to type the number twice.
I’ve used pascal since 1988 and have never seen anything like this.
Logged
Вот ещё довод в пользу решения этой проблемы.
source.pas (https://ideone.com/itdAqx):
var
k: longint;
begin
readln(k);
writeln(2*k);
end.
Запускаем с перенаправлением ввода-вывода:
source.exe <input.txt >output.txt
Если в файле input.txt было только число без следующего за ним перевода строки, то программа, скомпилированная Pascal ABC, зависнет навечно, а при компиляции через Turbo или Free Pascal – завершится успешным выводом в output.txt правильного ответа.
Это неожиданное отличие в поведении Pascal ABC сильно затрудняет автоматизированное тестирование написанных на нём решений.
Например, мы недавно добавили поддержку компилятора Pascal ABC на образовательном портале http://dl.gsu.by, но оказалось, что теперь в некоторых задачах не проходят по времени авторские решения.
В таких случаях помогает вручную добавить недостающие переводы строки в конце проблемных тестов. Но вручную так мигрировать множество задач слишком затратно, а автоматизированно опасно, т.к. в некоторых случаях с нечисловым вводом лишний перевод строки в тестах может всё поломать.
Надеюсь, проблему удастся разрешить внутри readln в Pascal ABC, приведя её в соответствие с остальными реализациями Паскаля.
Необходимо трактовать EOF точно так же как и EOL.
Я использую переменную: a: string
. Для того чтобы не закрывалась CMD и пользователь успел разглядеть результат: read (a)
.
Почему это помогает в других проектах, а именно в этом не помогает?
var god, rost: integer; a: string;
begin
Write('Ваш рост (в см): '); // Получаем данные в переменную rost
Read(rost);
Write('Ваш возраст : '); // Получаем данные в переменную god
Read(god);
Writeln('');
begin
if (rost > 130 ) then
Writeln('Ваш рост - ', rost)
else
Writeln('Ошибка ввода: Минимальный вводимый рост 130 см.');
if (god >= 12 ) then
Writeln('Вам ', god, ' лет' )
else
Writeln('Ошибка ввода: Минимальный вводимый возраст 12 лет');
end;
Writeln('Ваш идеальный вес: ', rost - 110 );
read (a)
end.
var
god, rost: integer;
a: string;
begin
Write('Ваш рост (в см): '); // Получаем данные в переменную rost
Read(rost);
Write('Ваш возраст : '); // Получаем данные в переменную god
Read(god);
Writeln('');
begin
if (rost > 130 ) then
Writeln('Ваш рост - ', rost)
else
Writeln('Ошибка ввода: Минимальный вводимый рост 130 см.');
if (god >= 12 ) then
Writeln('Вам ', god, ' лет' )
else
Writeln('Ошибка ввода: Минимальный вводимый возраст 12 лет');
end;
Writeln('Ваш идеальный вес: ', rost - 110 );
read (a)
end.