2013-02-10 3 views
1

Я написал небольшую консольную программу, требующую случайной очистки экрана терминала. Я написал код в/для системы * nix и использовал system("clear") в этих случаях. Когда мой код был завершен, я просмотрел его, чтобы оценить переносимость моего кода. Вышеупомянутый метод очистки экрана был моей единственной очевидной проблемой переносимости. Я тогда искал другие возможные способы для очистки терминала и нашел документацию на ANSI Cursor Indexing, а именно:Является ли курсор индексации ANSI переносимым

void cls() { 
    //27 is ESC ASCII char 
    printf("%c[2J",27); //clears screen 
    printf("%c[0;0H",27); //sets cursor at [0,0] 
} 

К моему удивлению, этот код работал прекрасно на моей системе ничего *. Мне было интересно, переносится ли эта схема индексирования курсора ANSI? ? Будет ли этот код компиляции и вести себя ожидаемо на всех системах со стандартным C компилятором»

+0

Compile на всех да. Ведите себя неожиданно? Зависит от того, что вы ожидаете. На терминалах без ANSI он будет просто печатать буквально, вероятно. Однако это не часть стандарта C. – Flexo

ответ

2

управляющие последовательности ANSI и VT100 очень близки , что означает, что если терминал является одним из двух, набор команд, перечисленных выше, определенно будет работать. Имейте в виду, что ANSI является надмножеством VT100, поэтому терминалы, совместимые с VT100, НЕ поймут ВСЕ последовательности ANSI.

Терминальные эмуляторы VT100 являются amo ng абсолютно общие (в том числе по умолчанию для xterm и других «оболочек стиля X-windows».

Ясно, скажем, эмулятор Volker-Craig 404 terminal [кто-нибудь его использует? ;)] НЕ поймут escape-последовательности ANSI или VT100 или даже ЛЮБЫЕ escape-последовательности.

Я хотел бы отметить также, что ваш код будет проще путем включения вашего ESC в постоянной строки:

printf("\033[2J"); 

или если вы хотите, чтобы сделать его немного более удобным для чтения:

#define ESC_STR "\033" 

printf(ESC_STR"[2J"); 
+0

Спасибо за совет по упрощению и описание связи ANSI/VT100. Очень полезно! –

+1

При написании строк, которые содержат числовые escape-последовательности, я предпочитаю пробивать такие вещи в их собственный цитируемый литерал. Например, printf ("Были" "7 \ 7" "5 ошибок!"); Хотя скобка ANSI не будет интерпретироваться как часть числового escape-кода, и в то время как синтаксический анализ букв в восьмеричном символе ограничен тремя символами, легко случайно получить числовое бегство, которое поглощает больше, чем нужно. – supercat

2

для кросс-операций платформы терминалов, как это я бы рекомендовал ncurses и pdcurses:

#include <curses.h> 

// Init curses somewhere before in your code 
initscr(); 

void cls() { 
    clear(); 
    move(0, 0); 
} 
+0

Является ли '' стандартной библиотекой C, или мне нужно будет ссылаться на нее? –

+0

Это сторонняя библиотека. Или ncurses для совместимых с ANSI/POSIX UNIX или pdcurses для DOS, OS/2, Win32, X11 и SDL. – tyrondis

+0

Моя программа небольшая и автономна в одном файле 'prog.c'. Я бы предпочел не добавлять внешнюю библиотеку и создавать make-файл для обеспечения переносимости. Я думаю, что для этого достаточно терминала VT100, но для более крупной программы я буду помнить внешние библиотеки. –