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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2012, 03:04   #1
Remarka
 
Регистрация: 17.06.2011
Сообщений: 6
Восклицание readln и readkey: проблема со считыванием Enter'а

собсна сабж
фрагмент кода:
Код:
      var
         c: char;
      begin
         reset (db);
         seek (db,filesize(db));
         repeat
           with stud do
             begin
               write ('чето-там'); readln (sname);
               write (db, stud);
             end;
           writeln ('Для выхода нажмите Esc, для продолжения - Enter)');
           с:=readkey;
         until c=#27;
        close (db);
      end;
То есть..после того как я ввожу что-то в переменную sname и нажимаю enter, то он сразу считывается ридкеем и повторяется цикл. Каким образом можно удалить его из буфера и дать возможность нажать клавишу Esc

Последний раз редактировалось Remarka; 11.12.2012 в 03:07.
Remarka вне форума Ответить с цитированием
Старый 11.12.2012, 03:31   #2
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Remarka Посмотреть сообщение
собсна сабж
фрагмент кода:
Код:
      var
         c: char;
      begin
         reset (db);
         seek (db,filesize(db));
         repeat
           with stud do
             begin
               write ('чето-там'); readln (sname);
               write (db, stud);
             end;
           writeln ('Для выхода нажмите Esc, для продолжения - Enter)');
           с:=readkey;
         until c=#27;
        close (db);
      end;
То есть..после того как я ввожу что-то в переменную sname и нажимаю enter, то он сразу считывается ридкеем и повторяется цикл. Каким образом можно удалить его из буфера и дать возможность нажать клавишу Esc
Ремарка, ты не совсем хорошо вырезал/вырезала фрагмент из кода. В этом куске ошибки (о которой ты пишешь) нет. Полагаю, что ошибка наведена другим куском, который находится где-то выше. Этот фрагмент отработал у меня (FPC) абсолютно корректно (после некоторых модификаций, не касающихся сути проблемы). Вот тебе тот код, который я запускал, смотри сам/сама:
Код:
uses
   CRT;
      var
         c: char;
         stud: record
            sname: string;
         end;
      begin
         //reset (db);
         //seek (db,filesize(db));
         repeat
           with stud do
             begin
               write ('чето-там'); readln (sname);
               //write (db, stud);
             end;
           writeln ('Для выхода нажмите Esc, для продолжения - Enter)');
           c:=readkey;
         until c=#27;
        //close (db);
      end.
Приведи весь код (или хотя бы фрагмент побольше), тогда посмотрим.

P.S.
и, плз, напиши, какой компилятор ты используешь - TP, FP, ABC...
Предпочитаю на "ты".

Последний раз редактировалось TinMan; 11.12.2012 в 03:34.
TinMan вне форума Ответить с цитированием
Старый 11.12.2012, 04:02   #3
Remarka
 
Регистрация: 17.06.2011
Сообщений: 6
По умолчанию

Тот код который ты привел тоже не совсем корректно работает
хотелось чтобы вывело
"Для выхода нажмите еск, для продолжения - ентер"
дальше я ввожу ентер или еск и оно либо выходит, либо снова начинает цикл

на деле у меня работает так:
"Для выхода нажмите еск, для продожения - ентер"
"че-то там"
(и ждет ввода) - после этого ввожу еск и любую клавишу и тогда уже прерывает

Код:
uses crt;
 type
      data=record
         sname:string;
         name:string;
         grp:string;
         reit:real;
      end;
var
      db: file of data;
      stud: data;
      
procedure entering;
         var
         c: string;
         begin

         reset (db);
         seek (db,filesize(db));
         repeat
         with stud do
         begin
         writeln ('Ввод данных о студенте');
         write ('введите фамилию: '); readln (sname);
         write ('ведите имя: '); readln (name);
         write ('введите группу:'); readln (grp);
         write ('введите рейтинг: '); read (reit);
         write (db, stud);
         end;
         writeln ('Добавить студента (Нажмите Esc - для отмены, для продолжения - Enter)');
         c:=readkey;
         until c=#27;
         close (db);
         end;




begin
      assign (db, 'db.txt');
      entering;
end.
Использую ABC
Remarka вне форума Ответить с цитированием
Старый 11.12.2012, 04:50   #4
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Remarka Посмотреть сообщение
Тот код который ты привел тоже не совсем корректно работает

хотелось чтобы вывело
"Для выхода нажмите еск, для продолжения - ентер"
дальше я ввожу ентер или еск и оно либо выходит, либо снова начинает цикл

на деле у меня работает так:
"Для выхода нажмите еск, для продожения - ентер"
"че-то там"
(и ждет ввода) - после этого ввожу еск и любую клавишу и тогда уже прерывает
о_О... если так - вопросы к производителям ABC. Повторюсь: в FP все абсолютно корректно (уверен, что в TP тоже).

Обращаю внимание: у тебя стоит READ, где должен стоять READLN. Это не только может, но и ДОЛЖНО привести к тому эффекту, который ты описываешь. Вот эта строка:
Код:
         write ('введите рейтинг: '); read (reit);
- исправь в ней read на readln.

Цитата:
Использую ABC
тогда я умолкаю на время, ибо я с ним дел не имел, не имею и не советую иметь.. Подожди до утра - придут специалисты по нему. На всякий случай уточни - у тебя старый глючный неподдерживаемый оригинальный ABC, разработка которого давно прекращена? Или все же более новый ABC.NET?
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 11.12.2012, 07:26   #5
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Использую ABC
Чур меня, чур
Цитата:
исправь в ней read на readln.
Разницы 0
Предлагаю сделать так :
Последовать совету Сержа :
Цитата:
Мой Вам совет: вообще, выкиньте Вы этих самодельных уродцев
(я имею в виду Pascal ABC и Pascal ABC NET) и возьмите либо FreePascal + Lazarus, либо (лучше),
если есть возможность, Delphi. и учитесь программировать с помощью настоящих средств разработки, а не
этих "псевдо-паскальных" языков..
Или последовать другому совету Сержа :
Код:
repeat
      Write('Выш выбор: ');
      readln(ct);
    until ct in ['1'..'5'];

    case ct of
      '1' : InitArr (a, n, m);
      '2' : PrintArr (a, n, m);

      '3' : InvertStr;
      '4' : PosMaxMin(a, n, m) ;

      '5' : {запрос подтверждения}
            begin
              WriteLn;
              Write('Вы действительно хотите выйти из программы? (Y/N) : ');
              ReadLn(ct);
              if (ct='Y') or (ct='y') then ct := '5';
                                  { возвращаем '5'-ку в переменную, по ней будет выход из цикла }
            end;
    end;
Тоесть слегка переделать программку
Poma][a вне форума Ответить с цитированием
Старый 11.12.2012, 11:45   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

можно и так попробовать:
Код:
procedure entering;
var
  c: char;
begin

  reset(db);
  seek(db, filesize(db));
  repeat
    with stud do
    begin
      writeln('Ввод данных о студенте');
      write('введите фамилию: '); readln(sname);
      write('ведите имя: '); readln(name);
      write('введите группу:'); readln(grp);
      write('введите рейтинг: '); readln(reit);
      write(db, stud);
    end;
    while KeyPressed do ReadKey;
    writeln('Добавить студента ? (Нажмите Esc - для отмены, для продолжения - Enter): ');
    repeat
      c := readkey;
      if c = #0 then c := readkey;
    until (c = #13) or (c = #27);
  until c = #27;
  close(db);
  WriteLn('Программа завершена!');
end;
....



p.s. хотя своё мнение насчёт уродцов я не поменял...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.12.2012, 18:59   #7
Remarka
 
Регистрация: 17.06.2011
Сообщений: 6
По умолчанию

Спасибо вам большое!
Remarka вне форума Ответить с цитированием
Старый 11.12.2012, 20:30   #8
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Код:
if c = #0 then
Серж, язык ереси берет не 0, а 1
Poma][a вне форума Ответить с цитированием
Старый 11.12.2012, 23:18   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Код:
if c = #0 then
Серж, язык ереси берет не 0, а 1
э... я не есть понимать, "язык ереси" - нихт ферштейн!



я не знаю, что Вы имели в виду, но запись
Цитата:
Код:
if c = #0 then
читается так: "если в переменной c символ с кодом ноль, тогда"

это можно записать и так
Код:
if ord(c) = 0 then
и так:
Код:
if c = chr(0) then
но запись с кодом символа мне лично нравится больше всего, она и простая и нативная для Паскаля...

Последний раз редактировалось Serge_Bliznykov; 11.12.2012 в 23:20.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.12.2012, 07:12   #10
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
э... я не есть понимать, "язык ереси" - нихт ферштейн!
язык ереси = всеми (особенно Вами) любимый Pascal.ABC
И прошу простить я не заметил второго цикла...
Просто в "с"заносится каким-то макаром единичка, и её фиг от-туда выгонишь.
Я же увидев
Цитата:
if c = #0 then c := readkey;
, и не посмотрев что это дело у нас в цикле (который находится в цикле), сделал ложное суждение..
Еще раз сорри
Poma][a вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема со считыванием файла в delphi aftio Помощь студентам 20 13.05.2012 23:16
Проблема со считыванием файла в delphi aftio Общие вопросы Delphi 2 07.05.2012 16:38
Проблема с считыванием данных из файла Achervov Общие вопросы C/C++ 4 19.03.2012 09:24
проблема из считыванием записи структуры из файла bloger Общие вопросы C/C++ 0 07.12.2011 22:25
DBGrid. Проблема со считыванием инфы из столбца. Teenager БД в Delphi 6 18.01.2008 15:33