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

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

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.08.2011, 14:26   #1
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию Ввод EOF c консоли - это Ctrl+Z и Ctrl+M Почему?

Объясните, пожалуйста, почему EOF c консоли (в Win XP) это Ctrl+Z и Ctrl+M.

На других форумах находил, что Ctrl+Z+Enter - это EOF, а у меня Ctrl+Z и Ctrl+M.

К какому источнику обратиться для понимания этой ситуации?

Может кто у себя проверит:

Код:
#include <stdio.h>
#include <locale.h>

int main () {
    setlocale(LC_ALL, "Rusian");

    char c = getchar();
    while (c != EOF) {
        putchar(c);
        getchar();
    }

    getchar();
    return 0;
}
8Observer8 вне форума Ответить с цитированием
Старый 02.08.2011, 14:58   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

привожу табличку из TechHelp'а (был такой справочник эпохи MS DOS)

Цитата:
Код:

Dec Hex Ctl  Name Control Meaning     │ Dec Hex Ctl  Name Control Meaning
▀▀▀ ▀▀▀ ▀▀▀  ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │ ▀▀▀ ▀▀▀ ▀▀▀  ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  0  00  ^@  NUL  null (end string)   │  16  10  ^P  DLE  data line escape
  1  01  ^A  SOH  start of heading    │  17  11  ^Q  DC1  dev ctrl 1 (X-ON)
  2  02  ^B  STX  start of text       │  18  12  ^R  DC2  device ctrl 2
  3  03  ^C  ETX  end of text         │  19  13  ^S  DC3  dev ctrl 3 (X-OFF)
  4  04  ^D  EOT  end of transmission │  20  14  ^T  DC4  device ctrl 4
  5  05  ^E  ENQ  enquiry             │  21  15  ^U  NAK  negative acknowledge
  6  06  ^F  ACK  acknowledge         │  22  16  ^V  SYN  synchronous idle
  7  07  ^G  BEL  bell                │  23  17  ^W  ETB  end transmit block
  8  08  ^H  BS   backspace           │  24  18  ^X  CAN  cancel
  9  09  ^I  HT   TAB horizontal tab  │  25  19  ^Y  EM   end of medium
 10  0a  ^J  LF   line feed           │  26  1a  ^Z  SUB  substitute
 11  0b  ^K  VT   vertical tab        │  27  1b  ^[  ESC  escape
 12  0c  ^L  FF   form feed           │  28  1c  ^\  FS   file separator
 13  0d  ^M  CR   carriage return     │  29  1d  ^]  GS   group separator
 14  0e  ^N  SO   shift out           │  30  1e  ^^  RS   record separator
 15  0f  ^O  SI   shift in            │  31  1f  ^_  US   unit separator
─────────────────────────────────────┴────────────────────────────────────────
 Box & Special Characters   ASCII■Decimal■Hex■Binary XRef             ASCII
отсюда легко увидеть, что нажатие CTRL-M возвращает такой же код, как и нажатие ENTER,
а нажатие CTRL-Z возвращает код 26 - который и интерпретируется как конец файла (EOF)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.08.2011, 15:16   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Serge_Bliznykov, благодарю!
8Observer8 вне форума Ответить с цитированием
Старый 03.08.2011, 09:36   #4
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Ctrl+Z+Enter - работает! Оказывается надо нажать Ctrl+Z -> отпустить -> нажать Enter. А я нажимал Ctrl+Z, и не отпуская их давил на Enter.
8Observer8 вне форума Ответить с цитированием
Старый 12.01.2023, 18:30   #5
Student_Dead1nS1de
Пользователь
 
Регистрация: 12.01.2023
Сообщений: 19
По умолчанию

Serge_Bliznykov, А как сделать, чтобы Enter только читался??? Ctr + M не должно никак влиять на программу.
Student_Dead1nS1de вне форума Ответить с цитированием
Старый 12.01.2023, 18:35   #6
Student_Dead1nS1de
Пользователь
 
Регистрация: 12.01.2023
Сообщений: 19
По умолчанию

8Observer8, А как сделать, чтобы Enter только читался??? Ctr + M не должно никак влиять на программу.
Student_Dead1nS1de вне форума Ответить с цитированием
Старый 12.01.2023, 18:53   #7
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

1. Вы Student_Dead1nS1de поспешили с вашим вопросом к этим товарищам.
Думаю, что если подождать ещё, этак лет 12, то будет в самый раз.

2.
Цитата:
А как сделать, чтобы Enter только читался??? Ctr + M не должно никак влиять на программу.
Что значит "только читался"? В какой программе?
Если вы пишите что-то своё, то на каком языке?
Напишите собственный обработчик вводимых с клавиатуры символов.
Анализируйте введённый код, и принимайте решение о том как поступать с тем или иным символом.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 12.01.2023, 20:08   #8
Student_Dead1nS1de
Пользователь
 
Регистрация: 12.01.2023
Сообщений: 19
По умолчанию

ViktorR, Кейс меню на FreePascal
procedure writemenu;
const menu: array[1..7] of string =
('Info',
'Write limits',
'Write step',
'Result',
'Inaccuracy',
'Visualisation',
'Exit');
pressedkey:=ReadKey();
if pressedkey = char(13) then
exit;
if pressedkey <> char(0) then begin
writemenu();
exit;
end;
pressedkey:=readkey();
if pressedkey = char(72) then
h:=h-1;
if pressedkey = char(80) then
h:=h+1;
if h>length(menu) then
h:=1
else if h<1 then
h:=length(menu);
writemenu();
end;
Student_Dead1nS1de вне форума Ответить с цитированием
Старый 12.01.2023, 20:10   #9
Student_Dead1nS1de
Пользователь
 
Регистрация: 12.01.2023
Сообщений: 19
По умолчанию

я знаю, что для получения кода клавиши расширенного диапазона нужно вызвать 2 функции чтения. Тогда по значению первого байта мы определим к какому диапазону относится первая клавиша. Но как это реализовать?
Student_Dead1nS1de вне форума Ответить с цитированием
Старый 12.01.2023, 22:24   #10
jillitil
Форумчанин
 
Аватар для jillitil
 
Регистрация: 17.10.2018
Сообщений: 184
По умолчанию

Приблизительно так:
Код:
CONST
  Key_ESC     = #27;
  Key_Enter   = #13;
  Key_Left    = #75;
  Key_Right   = #77;
  Key_Up      = #72;
  Key_Down    = #80;
  KeySpecial  = #00;

VAR
  Quit  : Boolean;
  Ch    : Char;

BEGIN
  Quit := False;
  REPEAT
    Ch := ReadKey;
    CASE Ch OF
      '0'..'z'  : Write(Ch);
      Key_ESC   : Quit := True;
      Key_Enter :  ;
      KeySpecial:
          BEGIN
              Ch := ReadKey;
              CASE Ch OF
                Key_Left  : Begin {  Код для кнопки ВЛЕВО } End;
                Key_Right :              ;
                Key_Up    :              ;
                Key_Down  :              ;
              END;
          END;
    END;
  UNTIL Quit;
END.
jillitil вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ctrl+C блокируется $of™@ke® Общие вопросы Delphi 4 22.11.2010 04:32
Копировать текст из webbrowser в memo (включить ctrl+c ctrl+v) копировать - вставить Alar Работа с сетью в Delphi 13 12.07.2010 18:16
D2010. Почему в строке uses, если нажать ctrl+space будут видны не все модули? TwiX Свободное общение 0 15.03.2010 02:12
Ctrl+Z реализация delphin100 Общие вопросы Delphi 6 10.09.2008 06:59
Ctrl+Enter kisska Win Api 3 22.08.2007 20:55