Помогите прокруткой и количеством строк в оболочке - PullRequest
0 голосов
/ 12 января 2011

Я программирую на C, и мне нужно знать количество строк stdin. После определенного количества строк мне также нужно прокрутить одну строку вверх ... Я использовал управляющий код ANSI (033 [1S), но я теряю содержимое прокручиваемой строки и не хочу этого.

РЕДАКТИРОВАТЬ: простой код для объяснения 2-й точки

#include <stdio.h>

int main(void) { 
    printf("one\ntwo\nthree\n"); 
    fputs("\033[1S", stdout);
return 0; 
}

Ответы [ 2 ]

1 голос
/ 12 января 2011

это хороший справочник для кодов ESCI прокрутки вниз страницы до таблицы кодов.

Я полагаю, что вам может понадобиться \ 033 [1E в дополнение к "1S", чтобы перейти на новую строку. поиграйтесь с кодами.

также я думаю, что вы можете получить строки / столбцы из окружающей среды.

код ниже благодаря "Hko" от http://www.linuxquestions.org/questions/programming-9/linux-c-syscall-to-get-number-of-columns-of-current-terminal-250252/

#include <sys/types.h>
#include <sys/ioctl.h>
#include <stdio.h>

int main()
{
    struct winsize ws; 

    ioctl(1, TIOCGWINSZ, &ws);
    printf("Columns: %d\tRows: %d\n", ws.ws_col, ws.ws_row);
    return 0;
}
0 голосов
/ 14 января 2011

похоже, что вы ошибаетесь в том, что такое stdin.

в вашем примере с комментариями:

#include <stdio.h> 
int main(void) { 
  int c; int i = 1; 
  printf("one\ntwo\nthree\n"); 
  //while((c=fgetc(stdin)) != NULL) { 
  // comparing it with null is not correct here
  // fgetc returns EOF when it encounters the end of the stream/file
  // which is why an int is returned instead of a char
  while((c=fgetc(stdin)) != EOF) { 
    if (c=='\n') { 
      printf("%d\n", i); i++; 
    } 
  } 
  return 0; 
}

вызов программы из командной строки должен вывести это

$ prog
one
two
three

вы должны отправить ему поток или канал, чтобы передать информацию через stdin

$ cat myfile | prog
one
two
three
4 # or however many lines are in myfile

stdin по умолчанию пуст.если вы введете его, ничего не будет отправлено, пока вы не введете

. Это то, что я вижу из компиляции кода выше:

1 ./eof_testing
one
two
three
jfklksdf #my typing here
1
fjklsdflksjdf #mytyping here
2
fjklsdflksdfjf # my typing here
3

----- добавление примера системного вызова stty----

#define STDIN_FD 0
#define STDOUT_FD 1 
#define CHUNK_SIZE 8

#define QUIT_CHAR (char)4 /* C-D */
int main(){
  write(STDOUT_FD,"hi\n",3);
  char buff[CHUNK_SIZE];
  int r, i;
  system("stty -echo raw");
  while(r = read(STDIN_FD, &buff, CHUNK_SIZE)){
    for(i = 0; i < r; i++){
      if(buff[i] == QUIT_CHAR)
        goto exit;
    }
    write(STDOUT_FD, &buff, r);
  }
  exit:
    system("stty echo cooked");
    return 0;
}

сейчас, однако есть целый ряд новых проблем, которые нужно решить, например, когда ключ отправляет символ '\ r', поэтому вместо новой строки он просто возвращается к началулиния.это связано с тем, что теперь, когда символы поступают непосредственно в программу, строки не заканчиваются символом '\ n', что происходило в режиме «приготовлено» терминалом.

http://starboard.firecrow.com/interface_dev/mle.git/editor/editor.c

...