getch и putchar не работают без возврата

Я пытался получитьgetch работать в другой программе без успеха. Таким образом, я сделал самую основную программу, которую я могу использоватьgetch так, как я хочу, чтобы он работал в основной программе.

Я исследовал необходимостьnoecho, cbreak, initscr а такжеnodelayЯ также пытался использоватьnewscr() но безуспешно.

Проблема, с которой я сталкиваюсь, заключается в том, что символы не выводятся на экран до тех пор, пока я не нажму "ввод", когда они должны бытьput на экран каждый цикл. Почему это происходит? Также курсор не возвращается в левую часть экрана на новой строке. например.

<code>abc  
   def
      ghi
</code>

Я искал ответ, но снова в тупике ...

<code>#include <stdio.h>
#include <ncurses.h>

int main()
  {
     initscr();cbreak(); noecho();nodelay(stdscr,0);
    char c ;
    while((c=getch())!=EOF){
    putchar(c);}

    return 0;
  }
</code>
 HostileFork21 апр. 2012 г., 07:47
Кстати, вы должны прочитатьgetch() вintнеchar. stackoverflow.com/questions/8464030/…
 Kaz21 апр. 2012 г., 07:35
Если вы просто хотите реализовать текстовый фильтр, очень плохая идея - ввести управление терминалом через проклятия. Интерактивный ввод за один раз не имеет ничего общего с проблемой фильтрации пустых строк.
 UNECS21 апр. 2012 г., 07:38
@Kaz; Я успешно использовал символьную фильтрацию с перенаправленным файлом stdin, но при использовании его только с stdin терминал выводит на экран stdin, который я не хочу. Так вот почему я пытаюсь управлять терминалом
 UNECS21 апр. 2012 г., 07:29
Если вам интересно, почему я это делаю, я пытаюсь получить входные данные от стандартного ввода и печатать только те строки стандартного вывода, которые не пусты.
 Kaz21 апр. 2012 г., 07:36
Чтобы скопировать непустые строки из стандартного ввода в стандартный вывод, попробуйтеgrep '.', Я могу заверить вас, что он не использует ncurses.

Ответы на вопрос(2)

И да, вы должны вызвать & quot; initscr () & quot; и & quot; cbreak () & quot ;.

SUGGESTIONS:

1) Сравните ваш код с этим ncurses & quot; привет миром & quot ;:

#include <ncurses.h>

int main()
{   
    initscr();          /* Start curses mode          */
    printw("Hello World !!!");  /* Print Hello World          */
    refresh();          /* Print it on to the real screen */
    getch();            /* Wait for user input */
    endwin();           /* End curses mode        */

    return 0;
}

2) Посмотрите, что произойдет, если вы сделаете & quot; refresh () & quot; и / или удалить "noecho ()".

3) В этом руководстве много полезной информации, которая также может помочь:

http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/

 UNECS21 апр. 2012 г., 07:49
Я хотел бы использовать кошку ... но это для домашней работы, следовательно, создание фильтра.
 UNECS21 апр. 2012 г., 07:42
Спасибо, добавил в закладки, и я явно не понял, что это за окно.
 21 апр. 2012 г., 07:45
Привет - Каз прав. Если вы хотите управлять терминалом для приложения в текстовом режиме, Ncurses - хороший выбор. Если вы хотите, чтобы простой фильтр удалял пустые строки (как вы объяснили впоследствии), просто используйте & quot; sed & quot; или "grep". Например: & quot;cat myfile|grep '.'
Решение Вопроса

stdout Поток буферизован.

Ваша программа получает индивидуальные символы в порядке; но выходной поток их буферизует.

Пытатьсяfflush(stdout); или переключениеstdout в небуферизованный режим сsetbuf(stdout, NULL);.

Проблема с отключением буферизации состоит в том, что она неэффективна для массовой обработки данных, когда вывод не является терминалом.

Вы можете сделать это условным для стандартного вывода tty:

if (isatty(fileno(stdout)))  /* #include <unistd.h> */
  setbuf(stdout, NULL);

Чтобы вернуть курсор в начало строки, нужно вывести возврат каретки\r, Это потому, что проклятия & apos;cbreak режим отключилONLCR Режим tty (на выходе, при отправке NL добавить CR).

Если вы безоговорочно добавляете\r, то он появится в файлах, когда ваш вывод будет перенаправлен. Итак, снова вам нужно немногоisatty хак.

Намного лучше было бы узнать, как использоватьtcgetattr а такжеtcsetattr функции для точного управления определенными параметрами tty, если все, что вам нужно, - это вводить символы за раз без эха, а не разрабатывать интерактивную программу на основе проклятий

Вы действительно хотите вводить символ за разом или просто набирать эхо? Эхо легко отключить. Вызовtcgetattr заполнитьstruct termios с текущими настройками дескриптора файла 0 (если это tty). Переверните несколько флагов, чтобы отключить эхо, затем позвонитеtcsetattr установить обновленную структуру. Когда ваша программа выйдет, будьте добры и верните оригинал. Готово.

 UNECS21 апр. 2012 г., 07:45
fflush (stdout) работает спасибо.
 UNECS21 апр. 2012 г., 07:56
Спасибо, я посмотрю на них, вероятно, это будет намного менее неряшливо, чем то, как я это делаю. постскриптумif((c == '\n'))putchar('\r');} работает но очень хрень код я знаю.
 UNECS21 апр. 2012 г., 12:28
; Спасибо, что получилосьtcsetattr как сон после многих гуглей о том, как установить флаги Cheers.
 21 апр. 2012 г., 07:50
Но это не решит проблему отсутствия возврата каретки. Я обновил ответ больше.

Ваш ответ на вопрос